-
volatile保证可见性 1.volatile是通过加入内存屏障和禁止重排序优化来实现的。 (1)对volatile变量执行写操作时,会在写操作后加入一条store屏障指令 这样CPU会把写入后的工作内存中的变量强制及时写入到主内存中,保证了主内存中是写入后的最新值;同时还会防止将写操作之前的指令重排序到写操作之后 (2)对volatile变量执行读操作时,会在读操作前加入一条load屏障指令 这样CPU会在读操作前将主内存中的变量强制刷新到线程工作内存,同时禁止重排序 综上,任何时刻,不同线程总能看到该变量的最新值。 2.volatile不能实现原子性 如图查看全部
-
不可见性的原因,线程交叉执行 重排序 工作线程主线程值没有及时更新查看全部
-
互斥锁 进入前清空值 拉主内存最新的值,出去前刷新到主内存中。保证可见性查看全部
-
线程1对x的修改更新到主内存,再更新到线程2 这样就是实现了变量x在线程1和线程2的可见性查看全部
-
各个线程只能通过主内存作为桥梁通讯查看全部
-
共享变量在线程不可见的原因查看全部
-
可见性查看全部
-
可见性实现原理查看全部
-
synchronized实现可见性 1.在main()中的代码中起两个线程分别进行write()和read() 2.在如图的代码中,执行结果有时候会出现result不为6,这就导致了不可见的问题 原因如下: (1)线程的交叉执行 比如先执行1.1,再执行2.1和2.2,结果result = 3 (2)重排序结合线程交叉执行 比如按照如图的执行顺序,会出现result=0 (3)共享变量更新后的值没有往主内存中及时更新 3.解决方法 public synchronized void write(){} public synchronized void read(){} 4.分析 (1)线程的交叉执行 加synchronized之后,同一时间只有一个线程会执行SynchronizedDemo类中的synchronized(this)代码块,其他线程对该类中所有其它synchronized(this)同步代码块的访问将会被阻塞。 这样就相当于锁,保证了synchronized{}执行的原子性 (2)重排序结合线程交叉执行 synchronized保证了内部的原子性,即使重排序也会遵循as-if-serial规则,并不影响执行结果 (3)共享变量未及时更新 synchronized的首要任务就能保证 5.注意: 因为有可能会出现读线程先执行的情况,所以加synchronized也不能保证执行正确,这是和synchronized无关的。 所以就要在读线程执行之前要休眠一下,保证写线程先执行 //启动线程执行写操作 synchronizedDemo.new ReadWriteThread(true).start(); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //启动线程执行读操作 synchronizedDemo.new ReadWriteThread(false).start();查看全部
-
内存可见性的概念及原理 首先声明内存可见性和JMM都是相对于多线程而言的。 1.JMM(java memory model)java内存模型 描述了Java程序中各种变量(线程共享变量)的访问规则, 以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。 JMM一般是相对于共享变量而言的,如果不是共享变量就不会存在内存的争用。 (1)所有的变量都存储在主内存中 (2)每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(是主内存该变量的一份拷贝) 2.JMM的两条规定 (1)线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写 (2)不同线程之间无法直接访问其他线程工作内存中的变量,线程之间变量值的传递需要通过主内存来作为中间媒介来完成 3.可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到。 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 4.共享变量可见性实现的原理 前面提到,一个线程对共享变量值的修改,能够及时地被其他线程看到。那么线程A对共享变量的修改要想被其他线程及时看到,必须经过如下2步骤: (1)线程A把修改过的共享变量值从自己的工作内存中刷新到主内存中 (2)其他线程及时将主内存中最新的共享变量的值更新到自己的工作内存中 过程如图 5.可见性的实现方式(代码) synchronized volatile查看全部
-
64位变量的读写可能不是原子操作查看全部
-
共享变量不可见的情况,不常出现,不过一旦出现就非常糟糕,所以,这也是我们学习保证其可见的原因。查看全部
-
final也可以实现可见性查看全部
-
synchronized和volatile的比较查看全部
-
volatile适用场景,没有Synchronize用途广泛查看全部
举报
0/150
提交
取消