synchronized关键字----在项目中的哪些地方有使用呢?
下文笔者讲述synchronized关键字的使用场景,如下所示
一篇文章让你彻底理解Java的单例设计模式
synchronized关键字的使用场景
场景1:修饰静态方法
对当前类对象加锁
进入同步代码前要获得当前类对象的锁
场景2:修饰实例方法
对当前实例对象加锁
进入同步代码前要获得当前实例对象的锁
场景3:修饰代码块
当synchronized括号里面的是对象
锁的就是实例对象
如果括号里面的是class类,锁的是类
synchronized关键字的示例代码
单例模式的双重检查锁
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
//先判断对象是否已经实例过,没有实例化过才进入加锁代码
if (uniqueInstance == null) {
//类对象加锁
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
注意事项:
uniqueInstance必须使用volatile关键字修饰
由于此代码 uniqueInstance = new Singleton();
会分为三个步骤运行
1.为uniqueInstance 分配内存空间
2.初始化uniqueInstance
3.将uniqueInstance 指向分配的内存地址
如果不使用volatile关键字修饰,则可能出现 1->3->2
的运行顺序,此运行顺序在单线程下没有任何问题,但是在多线程的情况下,就会发生异常
如:
线程 T1 执行了 1 和 3
此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空
因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化
相关阅读:一篇文章让你彻底理解Java的单例设计模式
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


