技术中心

这里象征着我们的态度和能力

>Java并发编程之同步互斥问题
作者:中国IT实验室    来源:中国IT实验室    发布时间:2012-03-12      浏览次数:8294
分享到:
欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入
  1. do{  
  2.  flag[i]=true;  
  3.  while(flag[j]);  
  4.  临界区;  
  5.  flag[i]=false;  
  6.  剩余区;  
  7. }while(1

Java实现代码如下:

  1. package mutiple_thread;  
  2.  
  3. public class OS_SYN_A2{  
  4.     public static  int flag[]=new int [3];  
  5.     public static int cnt=0;  
  6.     public static void main(String args[]){  
  7.         class proo implements Runnable{  
  8.             public proo(){  
  9.                   
  10.             }  
  11.             @Override 
  12.             public void run() {  
  13.                 // TODO Auto-generated method stub  
  14.                 while(true){  
  15.                     flag[1]=1;  
  16.                     while(flag[2]==1){  
  17.                           
  18.                     }  
  19.                     if(cnt==5){  
  20.                         flag[1]=0;  
  21.                     }else{  
  22.                         cnt++;  
  23.                         System.out.println("pro ++! now id"+cnt);  
  24.                         flag[1]=0;  
  25.                     }  
  26.                 }  
  27.             }  
  28.               
  29.         }  
  30.  
  31.         class conn implements Runnable{  
  32.  
  33.             @Override 
  34.             public void run() {  
  35.                 // TODO Auto-generated method stub  
  36.                 while(true){  
  37.                     flag[2]=1;  
  38.                     while(flag[1]==1){  
  39.                           
  40.                     }  
  41.                     //临界区  
  42.                     if(cnt==0){  
  43.                         flag[2]=0;  
  44.                     }else{  
  45.                         cnt--;  
  46.                         System.out.println("con --! now id"+cnt);  
  47.                         //退出临界区  
  48.                         flag[2]=0;  
  49.                     }  
  50.                 }  
  51.             }  
  52.         }  
  53.         new Thread(new proo()).start();  
  54.         new Thread(new conn()).start();  
  55.     }  
  56.       

这个算法的主要思路是通过设置flag来确定执行哪个线程,但是可能会造成饥饿,因此不行。

1.2 算法3

算法3通过共享两个变量 flag 和turn来实现同步。

  1. package mutiple_thread;  
  2.  
  3. public class OS_SYN_A3{  
  4.     public static  int flag[]=new int [3];  
  5.     public static int turn=0;  
  6.     public static int cnt=0;  
  7.     public static void main(String args[]){  
  8.         class proo implements Runnable{  
  9.             public proo(){  
  10.                   
  11.             }  
  12.             @Override 
  13.             public void run() {  
  14.                 // TODO Auto-generated method stub  
  15.                 while(true){  
  16.                     flag[1]=1;  
  17.                     turn=2;  
  18.                     while(flag[2]==1&&turn==2){  
  19.                           
  20.                     }  
  21.                     if(cnt==5){  
  22.                         flag[1]=0;  
  23.                     }else{  
  24.                         cnt++;  
  25.                         System.out.println("pro ++! now id"+cnt);  
  26.                         flag[1]=0;  
  27.                     }  
  28.                 }  
  29.             }  
  30.               
  31.         }  
  32.  
  33.         class conn implements Runnable{  
  34.  
  35.             @Override 
  36.             public void run() {  
  37.                 // TODO Auto-generated method stub  
  38.                 while(true){  
  39.                     flag[2]=1;  
  40.                     turn=1;  
  41.                     while(flag[1]==1&&turn==1){  
  42.                           
  43.                     }  
  44.                     //临界区  
  45.                     if(cnt==0){  
  46.                         flag[2]=0;  
  47.                     }else{  
  48.                         cnt--;  
  49.                         System.out.println("con --! now id"+cnt);  
  50.                         //退出临界区  
  51.                         flag[2]=0;  
  52.                     }  
  53.                 }  
  54.             }  
  55.         }  
  56.         new Thread(new proo()).start();  
  57.         new Thread(new conn()).start();  
  58.     }  
  59.       

这是一种正确的软件实现方法。

2、经典同步问题的Java实现

2.1 读者写者问题

这里实现的读者优先的算法,使用了Java并发包的信号量来实现。

实现的伪代码如下:

读者进程:

  1. while1){  
  2.  wait(mutex)  
  3.    count++;  
  4.    if(readercount==1){  
  5.    wait(writer);   
  6.  }  
  7. signal(mutex);  
  8. do reading;  
  9. wait(mutex);  
  10. cnt--;  
  11. if(cnt==0){  
  12.   signal(writer);  
  13. }  
  14. signal(mutex);  
  15. }  
  16. }

算法通过共享writer和mutex两个信号量,来处理同步问题

  1. package mutiple_thread;  
  2. import java.util.concurrent.Semaphore;  
  3. public class OS_Readerwriter{  
  4.     static Semaphore sem=new Semaphore(1);  
  5.     static Semaphore sem_wrt=new Semaphore(1);  
  6.     static int readercount=0;  
  7.     static String a="hahaha";  
  8.     public static void main(String args[]){  
  9.         class reader implements Runnable{  
  10.             public reader(){  
  11.                   
  12.             }  
  13.             @Override 
  14.             public void run() {  
  15.                 // TODO Auto-generated method stub  
  16.                 try {  
  17.                     sem.acquire();  
  18.                     readercount++;  
  19.                 } catch (InterruptedException e) {  
  20.                     // TODO Auto-generated catch block  
  21.                     e.printStackTrace();  
  22.                 }  
  23.                 if(readercount==1){  
  24.                     try {  
  25.                         sem_wrt.acquire();  
  26.                     } catch (InterruptedException e) {  
  27.                         // TODO Auto-generated catch block  
  28.                         e.printStackTrace();  
  29.                     }  
  30.                 }  
  31.                 sem.release();  
  32.                   
  33.                 System.out.println("Reading "+a);  
  34.                   
  35.                 try {  
  36.                     sem.acquire();  
  37.                 } catch (InterruptedException e) {  
  38.                     // TODO Auto-generated catch block  
  39.                     e.printStackTrace();  
  40.                 }  
  41.                 readercount--;  
  42.                 if(readercount==0){  
  43.                     sem_wrt.release();  
  44.                 }  
  45.                 sem.release();  
  46.             }  
  47.         }  
  48.           
  49.         class writer implements Runnable{  
  50.             public writer(){  
  51.                   
  52.             }  
  53.             @Override 
  54.             public void run() {  
  55.                 // TODO Auto-generated method stub  
  56.                 try {  
  57.                     sem_wrt.acquire();  
  58.                 } catch (InterruptedException e) {  
  59.                     // TODO Auto-generated catch block  
  60.                     e.printStackTrace();  
  61.                 }  
  62.                 a=a+"abc";  
  63.                 System.out.println("Writing "+a);  
  64.                 sem_wrt.release();  
  65.             }  
  66.               
  67.         }  
  68.         for(int i=1;i<=10;i++){  
  69.             new Thread(new writer()).start();  
  70.             new Thread(new reader()).start();  
  71.         }  
  72.           
  73.     }  

[1] [2] 下一页

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 昆明奥远科技有限公司版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号 增值电信业务经营许可证号:滇B2-20110045
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730