Java的多线程机制系列:(三)synchronized的同步原理

val=0;public synchronized void increase(){val++;}public int getVal(){return val;} }

但使用累加器的方式是这样的,如下面代码

execute(){Accumulator aor=new Accumulator();for(int i=0;i<100;i++){aor.increase();}int result=aor.getVal(); }}

虽然说Accumulator的increase方法是线程不安全的,但在上面的execute方法中,创建了方法内的局部对象,也就是说是在单线程下循环运行,不存在多线程并发的问题,此时JVM就会据此判断从而优化,消除掉在increase执行前的锁判断,以提高效率。与此类似的还有StringBuffer的append方法,JDK提供的这个方法用synchronized修饰来保证线程安全,但如果是在方法内创建StringBuffer对象并append,则会锁消除。

3. 锁粗化

原则上我们用synchronized修饰的代码块应该尽量小,以减少同步代码执行时间,但如果在一个线程中针对同一个对象锁有较多连续的同步代码块,那么再每次进同步代码块都争取锁就会带来不必要的效率损失,所以JVM在这种情况下会进行锁粗化。最常见的场景是循环里面调用方法,仍然是上面的ClearLockDemo的execute方法为例,假如说需要启用同步,,那么在每个循环体中都争夺锁、释放锁没有任何意义,JVM就会把整个循环都放在一个同步块下执行。

奋斗令我们的生活充满生机,责任让我们的生命充满意义!

Java的多线程机制系列:(三)synchronized的同步原理

相关文章:

你感兴趣的文章:

标签云: