Java 中使用同步 来保证数据的安全性,但是对于一些明显不会产生竞争的情况下,Jvm会根据现实执行情况对代码进行锁消除以提高执行效率。
比如下面一段代码
add 方法 使用synchronized 来实现同步 这是正确的,但是由于DataDemo对象是创建在方法内部的,并不影响其他线程的执行,所以虚拟机认为这里并不需要synchronized 来限制,所以就会执行锁消除。 StringBuffer 是线程安全的,但是如果StringBuffer的对象定义在局部方法里,也是会被虚拟机进行锁消除的。
比如下面一段代码
package thread;
public class SynchronizedDemo {
public void fuck(){
DataDemo demo = new DataDemo();
demo.add();
}
}
class DataDemo {
private int data;
public synchronized void add(){
data++;
}
public int get(){
return data;
}
}
add 方法 使用synchronized 来实现同步 这是正确的,但是由于DataDemo对象是创建在方法内部的,并不影响其他线程的执行,所以虚拟机认为这里并不需要synchronized 来限制,所以就会执行锁消除。 StringBuffer 是线程安全的,但是如果StringBuffer的对象定义在局部方法里,也是会被虚拟机进行锁消除的。