加锁有两种方式,一种是sychronized的重量级锁,一种是volatile,相比更为轻量级
先来看看具体的代码编写:
public class Singleton {
private volatile static Singleton single = null;
public static Singleton getSingleTest() {
if (single == null) {
synchronized (Single.class) {
if (single == null) {
single = new Singleton ();
}
}
}
return single;
}
}
重排序是指编译器和处理器为了优化程序性能而对指令序列进行排序的一种手段。重排序需要遵守一定规则:
a.重排序操作不会对存在数据依赖关系的操作进行重排序。
b.重排序是为了优化性能,但是不管怎么重排序,单线程下程序的执行结果不能被改变
比如:a=1;b=2;c=a+b这三个操作,第一步(a=1)和第二步(b=2)由于不存在数据依赖关系, 所以可能会发
生重排序,但是c=a+b这个操作是不会被重排序的,因为需要保证最终的结果一定是c=a+b=3。
重排序在单线程下一定能保证结果的正确性,但是在多线程环境下,可能发生重排序,影响结果.
使用样例:
public class Test {
private static int num = 0;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while(num==0){
}
}).start();
Thread.sleep(1000);
num = 1;
}
}
public class Test {
private volatile static int num = 0;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while(num==0){
}
}).start();
Thread.sleep(1000);
num = 1;
}
}
这两段代码因为volatile而导致结果完全不同,第一段代码会一直运行而不结束,
而第二段的volatile中的num一直用的都是主内存,因而会及时的更新,因而能够在近乎1S的时间内很快结束运行。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有