惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Vercel News
Vercel News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
C
Check Point Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
The Hacker News
The Hacker News
L
LINUX DO - 热门话题
T
Tenable Blog
Hugging Face - Blog
Hugging Face - Blog
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
P
Proofpoint News Feed
H
Hacker News: Front Page
P
Privacy & Cybersecurity Law Blog
月光博客
月光博客
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
博客园_首页
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CERT Recently Published Vulnerability Notes
Forbes - Security
Forbes - Security
I
InfoQ
Stack Overflow Blog
Stack Overflow Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
博客园 - 叶小钗
T
Threat Research - Cisco Blogs
aimingoo的专栏
aimingoo的专栏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Hacker News - Newest:
Hacker News - Newest: "LLM"
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
O
OpenAI News
G
Google Developers Blog
Martin Fowler
Martin Fowler
罗磊的独立博客
S
SegmentFault 最新的问题
T
Tor Project blog
量子位

博客园 - 外科手术医生

Spring-AI开发之旅 MACD秒解 历史的车轮 添加pdf的目录 spring ai提示词 纳瓦尔宝典-总结内容 小龙虾的skills哪里找? JMeter压测使用 Git仓库ssh不同环境配置 成功没有奇迹,只有积累----Bruce Lee 为什么要⽤ Foundry git命令下,mac环境下载依赖相关报错问题解决方案 数据分析/数据挖掘/机器学习---- 必读书目(转) 简单高效的语言 OSI模型-一图胜千言 dubbo分布式系统 JVM解剖 线程池 集合类 concurrent之CAS 架构师之路 责任链设计模式 Junit框架分析 线程详解 计划自己的时间
concurrent之volatile
外科手术医生 · 2021-10-11 · via 博客园 - 外科手术医生

  volatile轻量级的同步机制,保证可见性,不保证原子性,禁止指令重排  

  今天就分析一下volatile的关键字,内存可见性,在讲这个之前,我们来看一下,线程是怎么去处理数据的,我们都知道线程是cpu调度的单位,每个线程都是稀缺资源,创建线程会消耗cpu缓存和cpu运算资源,cpu在创建线程之后,线程具有自己的工作空间,java中的变量都是保存在主内存中,如果线程需要操作主内存,那么就需要copy一份变量到自己的工作空间中,进行修改变量操作,操作完,再把操作后的数据写入到主内存,jmm就是控制线程和主内存的变量输入和输出操作,如果这个变量被多个线程操作,当一个变量操作完,如果没有内存可见性的操作,其他线程是不知道该变量被修改了

  总结:线程修改变量副本拷贝,发送给主线程,如果变量加了volatile,立马通知给其他线程该变量修改完成  

  原子性:保证数据完整一致性,中间过程不可被分割,要么成功,要么失败,没有原子性,有可能写覆盖

  指令重排序:必须满足数据依赖性,计算机在执行程序时,为了提高性能,对编译器优化重排,指令并行执行,内存系统重排

  禁止指令重排:通过插入内存屏障指令,禁止在内存屏障前后的指令执行重排序优化,避免线程执行乱序的情况

yield线程中的关键字,让出线程执行,让其他线程在准备中(Runnable),之后一起执行,Thread.activeCount(),一个程序运行必须有2个或以上线程,类线程和gc线程

  解决原子性问题:

  1. 加sync锁
  2. 如果是变量可以使用AtomicInteger      
private static volatile SingletonDemo singletonDemo = null;
    
    /**
     * 双端检锁
     * @return
     */
    private static SingletonDemo getSingleton(){
        if (singletonDemo == null){
            synchronized (SingletonDemo.class){
                if (singletonDemo == null){
                    singletonDemo = new SingletonDemo();
                }
            }
        }
        return singletonDemo;
    }