Java当中的线程(三)

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 }

     

原文地址:https://www.cnblogs.com/iMirror/p/3742277.html