南宁站建站时间代写软文公司
- 为什么非volatile变量也有线程可见性?
- 不加volatile也可以看到变量变化是为什么?
- Thread.sleep() 和 System.out.println() 与内存可见性的影响
- Thread.sleep() 对线程可见性的影响?
- 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() + " ---> 结束");}}
}