先上一段代码,看看什么是多线程。
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函数。接下来解析一下这断代码的运行。
有几种情况:1.先运行1.1,再运行1.2,然后2.1、2.2,所以输出结果为2.
2.先运行1.1,然后2.1,然后1.2、2.2,所以输出结果为0.
因此,这段代码中的操作不是原子的,线程不安全,这就是多线程,通俗来说就是多个线程交叉并行运行,因此有时会造成脏读等现象。
synchronized 和 volatile的区别:
是否会线程阻塞 | 是否轻量级 | 是否有可见性 | 是否有原子性 | 作用范围 | |
synchronized | 会 | 否 | 是 | 是 | 变量、方法 |
volatile | 不会 | 是 | 是 | 否 | 变量 |