synchronized 和 volatile线程处理

先上一段代码,看看什么是多线程。

 1 public class test2 {
 2 
 3     private boolean flag = false;
 4 
 5     private int num = 0;
 6 
 7     public void write(){
 8         this.flag = true;
 9         num = 1;
10     }
11 
12     public void read(){
13         if(this.flag){
14             System.out.println(num *2);
15         }else{
16             System.out.println(num);
17         }
18     }
19 
20     /**
21      * @param args
22      */
23     public static void main(String[] args) {
24         test2 test2 = new test2();
25         Thread t1 = new Thread(new Runnable() {
26             @Override
27             public void run() {
28                 test2.write();
29             }
30         },"t1");
31 
32         Thread t2 = new Thread(new Runnable() {
33             @Override
34             public void run() {
35                 test2.read();
36             }
37         },"t2");
38         t1.start();
39         t2.start();
40     }
41 
42 }

简单说一下这段代码的逻辑,主要就是一个write和read函数,然后主函数中有两个线程 t1 和 t2,分别调用write和read函数。接下来解析一下这断代码的运行。

synchronized 和 volatile线程处理

有几种情况:1.先运行1.1,再运行1.2,然后2.1、2.2,所以输出结果为2.

                     2.先运行1.1,然后2.1,然后1.2、2.2,所以输出结果为0.

因此,这段代码中的操作不是原子的,线程不安全,这就是多线程,通俗来说就是多个线程交叉并行运行,因此有时会造成脏读等现象。

 

synchronized 和 volatile的区别:

  是否会线程阻塞 是否轻量级 是否有可见性 是否有原子性 作用范围
synchronized  变量、方法
volatile 不会 变量
上一篇:2022-1-6数据结构


下一篇:直方图比较