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 }

         

  • 相关阅读:
    Python中的装饰器之@wraps(四)
    python中装饰器之有参装饰器(三)
    python中装饰器之叠加装饰器(二)
    python中装饰器之闭包函数(一)
    python中的命名空间
    函数的嵌套与迭代
    函数对象
    matlab学习checkbox使用
    matlab学习滚动条改变文本数值
    matlab学习GUI可调的界面窗口
  • 原文地址:https://www.cnblogs.com/iMirror/p/3742277.html
Copyright © 2011-2022 走看看