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的单例设计模式
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。