Java中并发问题

news/2024/5/17 20:21:42 标签: 并发, synchronized, volatile

并发问题:

synchronized_2">1、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关键字修饰,目的是为了禁止JVM的重排序。

这段代码的执行过程为:
1、为uniqueInstance分配内存空间
2、初始化uniqueInstance
3、将uniqueInstance指向分配的内存地址

在JVM中具有指令重排的特性,执行顺序可能变为1->3->2,指令重排在单线程环境下不会出问题,但在多线程环境下会导致一个线程获得还没初始化的实例。
例如T1执行了1和3,此时T2调用了getUniqueInstance()发现uniqueInstance不为空,因此返回uniqueInstance,但此时uniqueInstance还未被初始化。

使用volatile可以禁止JVM的指令重排,保证多线程的环境下也能正常运行。

synchronized_36">2、synchronized关键字的底层原理

synchronized同步语句块实现使用的是monitorenter和monitorexit指令,其中
monitorenter指向同步代码块的开始位置,monitorexit指向同步代码块的结束位置。

synchronized修饰的方法并没有monitorenter和monitorexit指令,取而代之的是ACC_SYNCHONIZED标识,该标识指明了该方法是一个同步方法,JVM通过该ACC_SYNCHONIZED访问标志来辨别一个方法是否为同步方法,从而执行相应的同步调用。

synchronizedReentrantLock_44">3、谈谈synchronized和ReentrantLock的区别?

1、两者都可重入锁。可重入锁的概念是:自己可以再次获取自己的内部锁。
2、synchrnonized依赖于JVM而ReentrantLock依赖于API。ReentrantLock依赖于JDK层面实现的,需要lock()和unlock()方法配合try/finally语句块来完成。
3、ReentrantLock比synchronized增加了一些高级功能。高级功能主要有三点:等待可中断、可实现公平锁、可实现选择性通知

volatile_50">5、volatile关键字

volatile关键字的作用是:保证变量的可见性,在变量钱加volatile关键字就是指示JVM这个变量不稳定,每次使用它都到主存中读取。
还有一个作用是防止指令重排序。


http://www.niftyadmin.cn/n/1366702.html

相关文章

深圳地区为什么这么多开发人员外包

1、深圳有很多IT互联网公司,项目比较多,自身技术人员不足,需要外包人员来解决用人需求。2、深圳有很多传统型公司,主营业务不是IT这块,技术人员不多,项目有一定的周期性,也不想养那么多技术团队…

深圳为什么这么多外包人员?

众所周知,深圳市IT互联网发达城市,IT人才需求庞大,人才集群效应好。所以深圳的IT外包市场也很大。比如深圳几个外包大户,腾讯、华为、比亚迪、平安、顺丰、招商、万科、中兴等等。可见深圳的IT人才外包市场庞大,据说深…

关于Eureka的理解

Eureka服务端注册和发现 在Eureka中分为Eureka Client和Eurela Server 前者是一个Java客户端, 后者是Eureka的服务端,用于提供服务注册和发现。 通过创建一个Springboot服务,在启动类中添加 EnableEurekaServer ,通过该注解声明…

开发程序员的自我修养?

一个好的开发人员,应该能够全面、高效、严谨的去处理任何软件程序和业务问题,成为一个好的开发,是一个很有意思的话题,不过无论这个话题如何开展,基础两个字必不可少,虽然代码量是衡量开发能力的重要指标&a…

springcloud相关文档

1.SpringCloud和Dubbo SpringCloud和Dubbo都是现在主流的微服务架构 SpringCloud是Apache旗下的Spring体系下的微服务解决方案 Dubbo是阿里系的分布式服务治理框架 从技术维度上,其实SpringCloud远远的超过Dubbo,Dubbo本身只是实现了服务治理,而SpringCloud现在以及有21个子项目…

干货 | 各种编程语言都能做些什么?

首先,我们先普及一下编程语言的基础知识。用任何编程语言来开发程序,都是为了让计算机干活,比如编写一篇文章,下载一首MP3等,而计算机干活的CPU只认识机器的指令,所以,尽管不同的编程语言差异极…

深度好文 | 深圳IT人力外包客户如何做好外包客户的征询?

1、询问公司的人数、技术团队及技术人员分布情况。2、公司的项目情况。(产品型or项目型、项目简单介绍、项目所处阶段、项目配备人员、预计开发周期、项目远期规划)3、采用外包的原因。(人员编制、项目紧急、招聘流程满、技术招聘能力不足、项…

索引的理解

索引 索引是建立在列上的一组数据结构,索引的数据结构存储了该列中的所有的值 B-Tree索引: B-Tree是一个常用的用于索引的数据结构,在B-Tree中的数据是有序的。 因为B-Tree是有序的,因此存储的列都是排好序的,因此…