码迷,mamicode.com
首页 > 系统相关 > 详细

进程互斥

时间:2020-06-11 13:23:09      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:exactly   imp   info   multi   图片   dcl   ble   read   mrc   

public class TT{
        public static void main(String arg[]){
            MyResourceClass mrc = new MyResourceClass();
            Thread aThreadArray[] = new Thread[20];
            System.out.println("\t 刚开始的值是:" +mrc.getInfo()); //20 个线程*每个线程加 1000 次*每次加 50
            System.out.println("\t 预期的正确结果是:"+20*1000*50);
            System.out.println("\t 多个线程正在工作,请稍等!");
            for(int i=0;i<20;i++){//产生 20 个线程并开始执行
            aThreadArray[i] = new Thread(new MyMultiThreadClass(mrc));
            aThreadArray[i].start();
        }
        WhileLoop://等待所有线程结束
                while(true){
            for(int i=0;i<20;i++)
                if(aThreadArray[i].isAlive())continue WhileLoop;
            break;
        }
System.out.println("\t 最后结果是:" +mrc.getInfo());
    }
}
class MyMultiThreadClass implements Runnable{
    MyResourceClass UseInteger;
    MyMultiThreadClass(MyResourceClass mrc){UseInteger = mrc;}
    public void run(){
        int i, LocalInteger;
        for(i = 0;i< 1000;i++){
            LocalInteger = UseInteger.getInfo();//把值取出来
            LocalInteger +=50;
            try{Thread.sleep(10);//做一些其他的处理
            }catch(InterruptedException e){}
            UseInteger.putInfo(LocalInteger);//把值存回去
        }
    }
}
class MyResourceClass{
    int IntegerResource;
    MyResourceClass(){ IntegerResource =0;}
    public int getInfo(){ return IntegerResource;}
    public void putInfo(int info){IntegerResource = info;}
}

先看线程之间需要互斥的情况。设有若干线程共享某个变量,且都对变量有修改。如果它们之间不考虑相互协调工作,就会产生混乱。比如,线程A和B共用变量 x ,都对 x 执行增1操作。由于A和B没有协调,两线程对 x 的读取、修改和写入操作会相互交叉,可能两个线程读取同样的 x 值,一个线程将修改后的 x 新值写入到 x 后,另一个线程也把自己对 x 的修改后的新值写入到 x。这样,x 只记录后一个线程的修改作用。

程序执行的输出结果是:

刚开始的值是:0

预期的正确结果是:1000000

多个线程正在工作,请稍等!

最后的结果是:50050

 

造成最后结果不正确的原因是,可能有多个线程取得的是同一个值,各自累计并存入,累计得慢的,后存入的线程把别的执行快的线程的修改覆盖掉了。所以最终实际结果 比预期的要小的多。

 

 

改进:另定义一个累计修改的方法,并将这个方法作为临界段,即某一时刻只允许一个线程做累计修改工作,这就能保证得到正确结果。修改后的 run()方法,及 MyResourceClass 类新增的方法如下

 1 public void run(){
 2 for(int i=0;i<1000;i++){
 3 UseInteger.sumResource(50);
 4 try{
 5 Thread.sleep(10);//做一些其他的处理
 6 }catch(InterruptedException e){}
 7 }
 8 }
 9 class MyResourceClass{
10 int IntegerResource;
11 MyResourceClass(){IntegerResource =0;}
12 public int getInfo(){ return IntegerResource;}
13 public void putInfo(int info){ IntegerResource =info;}
14 synchronized void sumResource(int q){         
15 int localInteger;
16 LocalInteger = getInfo();//把值取出来
17 LocalInteger +=q;
18 putInfo(LocalInteger);//把值存回去
19 }
20 }

 

 

 

  

public void run(){

 

for(int i=0;i<1000;i++){

 

UseInteger.sumResource(50);

 

try{

 

Thread.sleep(10);//做一些其他的处理

 

}catch(InterruptedException e){}

 

}

 

}

 

class MyResourceClass{


 

141 / 177


Java4747

技术图片 

 

int IntegerResource;

 

MyResourceClass(){IntegerResource =0;}

 

public int getInfo(){ return IntegerResource;}

 

public void putInfo(int info){ IntegerResource =info;}

 

synchronized void sumResource(int q){

 

int localInteger;

 

LocalInteger = getInfo();//把值取出来

 

LocalInteger +=q;

 

putInfo(LocalInteger);//把值存回去

 

}

 

}

进程互斥

标签:exactly   imp   info   multi   图片   dcl   ble   read   mrc   

原文地址:https://www.cnblogs.com/lhywxhn/p/13092399.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!