synchronized关键字----在项目中的哪些地方有使用呢?

乔欣 Java面经 发布时间:2022-11-12 12:18:32 阅读数:18791 1 并发编程面试题(2023最新版)
下文笔者讲述synchronized关键字的使用场景,如下所示

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的单例设计模式
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaMianJing/202211/16682267644875.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者