1. 多线程的数据安全
2. 同步线程的方法
1. 多线程的数据安全
1 class MyThread implements Runnable{ 2 int i = 100; 3 public void run(){ 4 while(true){ 5 System.out.println(Thread.currentThread().getName()+i); 6 i--; 7 Thread.yield(); 8 if(i<0){ 9 break; 10 } 11 } 12 } 13 }
1 class Test{ 2 public static void main(String args []){ 3 MyThread myThread = new MyThread(); 4 //生成两个Thread对象,但这两个Thread对象共用同一个线程体 5 Thread t1 = new Thread(myThread); 6 Thread t2 = new Thread(myThread); 7 8 //每个线程都可以设置名字 或 获取名字 9 t1.setName("线程a"); 10 t2.setName("线程b"); 11 12 t1.start(); 13 t2.start(); 14 } 15 }
代码看似结果会是 线程a100-->线程b99-->线程a98-->线程b97-->...
但也会有可能数据安全问题
产生线程a100--->线程b100--->线程b98 的可能的原因是:
线程a100 : System.out.println(Thread.currentThread().getName()+i);
还没到 i-- , 线程b就开始执行了
线程b100: System.out.println(Thread.currentThread().getName()+i);
线程a : i--
线程b: i--
线程b98 :System.out.println(Thread.currentThread().getName()+i);
因此 多线程共用同一份数据时, 有可能产生数据安全问题
2. 同步线程的方法
解决上述问题, 同步线程
1 class MyThread implements Runnable{ 2 int i = 100; 3 public void run(){ 4 while(true){ 5 synchronized(this){ //同步锁, 线程会一直执行到线程锁里面的代码执行完毕 6 System.out.println(Thread.currentThread().getName()+i); 7 i--; 8 Thread.yield(); 9 if(i<0){ 10 break; 11 } 12 } 13 } 14 } 15 }