zoukankan      html  css  js  c++  java
  • 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 }

         

  • 相关阅读:
    C:大数相加
    杭电2186:悼念512汶川大地震遇难同胞——一定要记住我爱你
    实验五
    安装vmtools
    ubuntu20.04换源
    实验一 灯程序——OK6410A开发板LINUX3.0.1(嵌入式开发)
    OK6410A开发板LINUX3.0.1配置(嵌入式开发)
    实验四 Makefile
    虚拟机联网
    实验三 按键灯
  • 原文地址:https://www.cnblogs.com/iMirror/p/3742277.html
Copyright © 2011-2022 走看看