说一说synchronized关键字
synchronized是java语言中的一个关键字,如同public、private、trycatch等可以在Java中直接被编译器识别的具有功能性的单词。
synchronized中文意思是同步的,也表示它在Java中主要负责的是多个线程之间资源的同步性。被它修饰过的方法或者代码块或是资源可以保证在执行过程中任意时刻只有一个线程执行。
Java6版本之前的synchronized属于重量级锁。使用互斥量mutex来实现同步锁的功能。
在synchronized有3种锁的形态,synchronized首先是一个偏向锁。偏向锁指的是当一个线程一直访问一段同步代码时,那么下次线程想要获取锁时,优先级是最高的,这个线程会一直占有这个锁。这就叫偏向锁。
而其他获取不到锁的线程就会通过自旋的方式尝试获取锁,这时候锁就会升级,升级为轻量级锁。当锁已经升级为轻量级锁后,其他线程自旋到一定时间后仍然获取不到锁时,线程就会阻塞,该锁膨胀为重量级锁。
总体来说,重量级锁是会阻塞的锁。一旦成为重量级锁,如果不是占有锁的线程,其他线程申请资源时,一律阻塞。
Java6以后,synchronized引入大量的优化,如自旋锁,适应性自旋锁,缩消除,锁粗化,偏向锁,轻量级锁等技术来减少锁操作的开销,这些优化使synchronized也可以在实际的使用中有更好的表现。
synchronized用法是修饰实例方法,修饰静态方法,修饰代码块。除了修饰静态方法是作用于所有对象实例外,另外两种修饰方法作用于当前对象实例类。
字符串常量池具有缓存功能,所以一般不用synchronized修饰。
synchronized原理是使用monitorenter和monitorexit指令来尝试获取monitor持有权。jvm中使用ObjectMonitor调用c++来实现。