当前位置: 首页 > news >正文

多线程笔记: volatile、synchronized、Monitor等

  1. 为什么非volatile变量也有线程可见性?
  2. 不加volatile也可以看到变量变化是为什么?
  3. Thread.sleep() 和 System.out.println() 与内存可见性的影响
  4. Thread.sleep() 对线程可见性的影响?
  5. Java中的Monitor监视器是什么?
@Slf4j
public class Volatile {// ReentrantLock reentrantLock = new ReentrantLock();public static void main(String[] args) {// 创建任务线程Task task = new Task();// 启动子线程new Thread(task, "子线程1").start();try {// 主线程修改共享变量,  查看是否能停止子线程Thread.sleep(3000);task.buffer = false;Thread.sleep(100000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程: " + Thread.currentThread().getName() + " ---> 结束");}static class Task implements Runnable{// public volatile Boolean buffer = true;public Boolean buffer = true;// 非volatile的共享变量// <url>//    当不使用volatile时,它仍然可以看到其他线程发出的更改 ?//        原因:  System.out.println()会执行一段synchronized同步代码,而synchronized会让当前线程读取到最新的高速缓存值//        原因2: Thread.sleep 也会触发同步//     https://www.jianshu.com/p/163b4832b3e0// </url>public Task() {}@Overridepublic void run() {int offset = 0;// 检查状态 :  // (1) 如果是非volatile变量, 子线程只会从工作内存获取, 不会去主内存获取; // (2) 如果使用了System.out.println,  由于println的实现类PrintStream中使用了synchronized, 则会从主存刷新数据到工作内存, 保证线程可见性// (3) 如果使用了Thread.sleep, 当子线程休眠结束, 会重新从主内存获取数据到工作内存,从而达到刷新左右,保证线程可见性while (buffer){
//                try {
//                    Thread.sleep(200);//                    // System.out.println("线程: " + Thread.currentThread().getName() + "======> " + (++offset));
//                    //log.info("线程: " + Thread.currentThread().getName() + "======> " + (++offset));
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }}// System.out.println("线程: " + Thread.currentThread().getName() + " ---> 结束");log.info("线程: " + Thread.currentThread().getName() + " ---> 结束");}}
}
http://www.lryc.cn/news/148385.html

相关文章:

  • shell语法--数组相关
  • AI:05 - 基于深度学习的道路交通信号灯的检测与识别
  • The Sandbox 即将参加韩国区块链周,并带来一系列独家周边活动!
  • Mysql高阶语句 (一)
  • win10 ping不通 Docker ip(解决截图)
  • 讲讲几道关于 TCP/UDP 通信的面试题
  • golang 连接 oracle 数据库 增删改查
  • Unity——音频管理器(附例子)
  • TCP协议基础
  • C# NetTopologySuite+ProjNet 任意图形类型坐标转换
  • Windows笔记本电脑开机黑屏
  • Samb共享用户的设置和修改Linux用户的id号,修改Linux组的id号,加入组,删除组成员等
  • VBA:对Excel单元格进行合并操作
  • HTML5离线储存
  • cmd: Union[List[str], str], ^ SyntaxError: invalid syntax
  • 2023高教社杯数学建模思路 - 案例:异常检测
  • FFDNet-pytorch版本代码测试教程
  • uni-app项目由hbuilder项目转化为cli项目
  • 使用SpaceDesk连接平板作为电脑副屏详细步骤教程
  • 云备份——第三方库使用介绍(下)
  • springboot实战(一)之项目搭建
  • 线性代数的学习和整理16:什么是各种空间(类型),向量空间,距离(类型)?
  • css实现文字翻转效果
  • 19 Linux之Python定制篇-apt软件管理和远程登录
  • WebDAV之π-Disk派盘 + notototo
  • _kbhit() and getch() 在小游戏中用不了。因为控制台函数,仅在控制台程序中可用
  • dayjs格式转换成日期
  • mfc140u.dll丢失如何修复?解析mfc140u.dll是什么文件跟修复方法分享
  • STM32--SPI通信与W25Q64(2)
  • 微信小程序 校园周边美食商城分享系统