优秀的字体设计网站电商网站搜索引擎怎么做
- 为什么非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() + " ---> 结束");}}
}