Synchronized和volatile 的区别,两者使用的场景

同步关键字Synchronized使用的场景:

 Synchronized的修辞范围为:

  1. 修饰一个代码块

   2.修饰一个方法

   3.修饰一个类

   4.修饰一个静态的方法

public class Thread1 implements Runnable {
   public void run() {
     synchronized(this) {
          for (int i = 0; i < 5; i++) {
          System.out.println(Thread.currentThread().getName() + " synchronized loop " +    i);
     }
   }
}
public static void main(String[] args) {
   Thread1 t1 = new Thread1();
   Thread ta = new Thread(t1, "A");
   Thread tb = new Thread(t1, "B");
   ta.start();
   tb.start();
 }
}
结果:
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4

绝对的互斥

个人的理解是:因为同步关键字Synchronized不能修饰变量(不能直接使用synchronized声明一个变量),不能使变量得到共享,故引入了轻量级的Volatie  

volatile的使用场景

1. volatile可以修饰变量,共享变量。例如:volatile boolean status =false;

2. 保障了共享变量对所有线程的可见性。即可保证在线程A将其修改为true时,线程B可以立即得知:volatile boolean status = true; 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的

3. 禁止进行指令重排序。

在多线程下,做判断的时候,没有共享变量的时候,就会出现问题

假如线程1先执行,线程2后执行:

//线程1
boolean stop = false;
while(!stop){
    doSomething();
}
 
//线程2
stop = true;

       这段代码是很典型的一段代码,很多人在中断线程时可能都会采用这种标记办法。但是事实上,这段代码会完全运行正确么?即一定会将线程中断么?不一定,也许在大多数时候,这个代码能够把线程中断,但是也有可能会导致无法中断线程(虽然这个可能性很小,但是只要一旦发生这种情况就会造成死循环了)。

  下面解释一下这段代码为何有可能导致无法中断线程。每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。

  那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。

  但是用volatile修饰之后就变得不一样了:

  第一:使用volatile关键字会强制将修改的值立即写入主存;

  第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);

  第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。

  那么在线程2修改stop值时(当然这里包括2个操作,修改线程2工作内存中的值,然后将修改后的值写入内存),会使得线程1的工作内存中缓存变量stop的缓存行无效,然后线程1读取时,发现自己的缓存行无效,它会等待缓存行对应的主存地址被更新之后,然后去对应的主存读取最新的值。

  那么线程1读取到的就是最新的正确的值。

Synchronized 与 volatile 的区别

1.与使用Synchronized相比,声明一个volatile字段的区别在于没有涉及到锁的操作。

2.volatile声明的是变量,修饰的是变量。

参考文章:https://www.cnblogs.com/dolphin0520/p/3920373.html

你可能感兴趣的:(并发编程,--,并发类)