首页 > 其他分享 >volatile关键字剖析

volatile关键字剖析

时间:2023-08-03 10:56:56浏览次数:37  
标签:Singleton instance value 剖析 关键字 实例 volatile 线程

这里引入一个案例 :实现单例模式的双重检查锁

package com.chunling.cloud.test;

public class Singleton {

private static Singleton instance;

private int value;

private Singleton() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
value = 42; //
}

public int getValue() {
return value;
}

public static Singleton getInstance() {
if (instance == null) { // 第一次检查,避免不必要的同步
synchronized (Singleton.class) {
if (instance == null) { // 第二次检查,确保只有一个实例被创建
instance = new Singleton();
}
}
}
System.out.println(instance.getValue());
return instance;
}


public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
Thread thread = new Thread(() -> Singleton.getInstance());
thread.start();
}
}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

讨论:此案例中的instance实例是否应该被volatile关键字修饰呢?  官方给的答案是要加volatile关键字

讲到这里,先来阐述下啊volatile的作用:

      1.保证各线程对其修饰变量的可见性(通过总线锁/cpu三级缓存锁实现)

    就可见性问题而言:即使不加volatile ,我们的instance实例也能被线程共享(静态成员变量是存储在jvm运行时数据区的方法区【方法区的内容会被线程共享】);

         所以上面代码中加同步上锁后,保证了线程访问的顺序性,所以也保证了对象一定是单例的;

   2.防止指令重排序(这里不是我们java代码的指令)

         如上面示例中的value属性,jvm在初始化instance对象时会经历三步(类似于我们spring的三级缓存的过程),

                    step1:实例化对象instance,此时value的值为0;

                    step2:给instance对象赋值,value=8;

                    step1:给instance和value建立连接,即将value设置为instance的成员变量;

    所以这个过程有可能会造成step1实例化完之后对象返回了,后续线程可能会拿到一个没有初始化的instance对象。

 

但是:经过验证  如果不加volatile关键字的话 实例化出来的对象一样  且对象内部的value值也一样; 

可能是因为我对对象的加载过程还没有深度研究的原因吧,待研究完后再来打脸。。。。

 

      

 

标签:Singleton,instance,value,剖析,关键字,实例,volatile,线程
From: https://www.cnblogs.com/qlsty/p/17602692.html

相关文章

  • github代码外泄监控——可用来提供源码泄露检测服务,数据泄露场景,原理就是在github搜索
     Hawkeye监控github代码库,及时发现员工托管公司代码到GitHub行为并预警,降低代码泄露风险。特点优点邮箱告警通知黑名单添加爬虫任务设置缺点spider通过关键词在github进行模糊搜索,搜索结果会比较杂依赖Python3.x(Hawkeye支持Python3.xonLinuxandmacOS;2.x兼容性需自行修改测试......
  • 高效Python-2-1 剖析(Profiling 性能分析)
    2从内置功能中获取最高性能本章包括剖析代码以发现速度和内存瓶颈更有效地利用现有的Python数据结构了解Python分配典型数据结构的内存成本使用懒编程技术处理大量数据有很多工具和库可以帮助我们编写更高效的Python。但是,在我们深入研究提高性能的所有外部选项之前,让我......
  • 软件测试 | Java中的关键字
    Java中也有许多关键字(也叫保留字),如public、static等,这些关键字不能当做标识符使用。表2-1列出了Java中的关键字,这些关键字并不需要去硬背,因为在程序开发中一旦使用了这些关键字做标识符时,编辑器会自动提示错误。对于以上的关键字,要特别注意的有如下3点:(1)虽然goto、const在Java中并没......
  • 万邦阿里巴巴中国站按关键字搜索商品 API 返回值说明
    onebound.1688.item_search公共参数请求地址:console.open.onebound.cn/console/?i=…名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[y......
  • 万邦1688阿里巴巴中国站按关键字搜索商品 API 返回值说明
    注册Key和secret测试请求参数请求参数:q=女装&start_price=0&end_price=0&page=1&cat=0&discount_only=&sort=&page_size=40&seller_info=no&nick=&seller_info=&nick=&ppath=&imgid=&filter=参数说明:q:搜索关键字cat:分类IDstart_price:开始价......
  • Cluster机制剖析1——进程复制
    Forkfork()是类UNIX系统父进程复制子进程的系统调用,在Node里通过libuv实现了对不同平台(unix,linux,windows)的封装。引用百度百科的一段话来描述fork的特性:fork之后的子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,......
  • 关键字: datagridview 属性 说明
    关键字:datagridview属性说明①取得或者修改当前单元格的内容②设定单元格只读③不显示最下面的新行④判断新增行⑤行的用户删除操作的自定义⑥行、列的隐藏和删除⑦禁止列或者行的Resize⑧列宽和行高以及列头的高度和行头的宽度的自......
  • 亚马逊国际按关键字搜索商品 API 返回值
    item_search-按关键字搜索商品 前往注册开通测试onebound.amazon.item_search公共参数名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否......
  • 如何按关键字搜索商品详情
      快速注册开通测试onebound.taobao.item_search公共参数名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes,将调用缓存的......
  • 如何按关键字搜索获取商品详情
     前往注册开通测试onebound.suning.item_search公共参数名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes,将调用缓存的数......