标签: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