网站建设销售找客户话术,钢丝网片每平米价格,服务好的深圳动画营销推广,企业标准化体系建设流程为什么非volatile变量也有线程可见性#xff1f;不加volatile也可以看到变量变化是为什么#xff1f;Thread.sleep() 和 System.out.println() 与内存可见性的影响Thread.sleep() 对线程可见性的影响#xff1f;Java中的Monitor监视器是什么#xff1f;
Slf4j
public clas…为什么非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// /urlpublic 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() --- 结束);}}
}