首页 > 软件测试/ 正文
Java并发编程之同步互斥问题
2012-09-16 23:49:30 ℃在操作系统中同步与互斥是一个重要问题,这里主要研究一下怎样用Java来实现操作系统中的一些同步互斥算法。
1、软件实现临界区域问题
下面给出算法和Java实现代码。
1.1 算法2
算法2的伪代码如下:
do{ flag[i]=true; while(flag[j]); 临界区; flag[i]=false; 剩余区; }while(1)
Java实现代码如下:
package mutiple_thread; public class OS_SYN_A2{ public static int flag[]=new int [3]; public static int cnt=0; public static void main(String args[]){ class proo implements Runnable{ public proo(){ } @Override public void run() { // TODO Auto-generated method stub while(true){ flag[1]=1; while(flag[2]==1){ } if(cnt==5){ flag[1]=0; }else{ cnt++; System.out.println("pro ++! now id"+cnt); flag[1]=0; } } } } class conn implements Runnable{ @Override public void run() { // TODO Auto-generated method stub while(true){ flag[2]=1; while(flag[1]==1){ } //临界区 if(cnt==0){ flag[2]=0; }else{ cnt--; System.out.println("con --! now id"+cnt); //退出临界区 flag[2]=0; } } } } new Thread(new proo()).start(); new Thread(new conn()).start(); } }
这个算法的主要思路是通过设置flag来确定执行哪个线程,但是可能会造成饥饿,因此不行。
1.2 算法3
算法3通过共享两个变量 flag 和turn来实现同步。
package mutiple_thread; public class OS_SYN_A3{ public static int flag[]=new int [3]; public static int turn=0; public static int cnt=0; public static void main(String args[]){ class proo implements Runnable{ public proo(){ } @Override public void run() { // TODO Auto-generated method stub while(true){ flag[1]=1; turn=2; while(flag[2]==1&&turn==2){ } if(cnt==5){ flag[1]=0; }else{ cnt++; System.out.println("pro ++! now id"+cnt); flag[1]=0; } } } } class conn implements Runnable{ @Override public void run() { // TODO Auto-generated method stub while(true){ flag[2]=1; turn=1; while(flag[1]==1&&turn==1){ } //临界区 if(cnt==0){ flag[2]=0; }else{ cnt--; System.out.println("con --! now id"+cnt); //退出临界区 flag[2]=0; } } } } new Thread(new proo()).start(); new Thread(new conn()).start(); } }
这是一种正确的软件实现方法。
2、经典同步问题的Java实现
2.1 读者写者问题
这里实现的读者优先的算法,使用了Java并发包的信号量来实现。
实现的伪代码如下:
读者进程:
while(1){ wait(mutex) count++; if(readercount==1){ wait(writer); } signal(mutex); do reading; wait(mutex); cnt--; if(cnt==0){ signal(writer); } signal(mutex); } }
算法通过共享writer和mutex两个信号量,来处理同步问题
package mutiple_thread;
import java.util.concurrent.Semaphore;
public class OS_Readerwriter{
static Semaphore sem=new Semaphore(1);
static Semaphore sem_wrt=new Semaphore(1);
static int readercount=0;
static String a="hahaha";
public static void main(String args[]){
class reader implements Runnable{
public reader(){
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
sem.acquire();
readercount++;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(readercount==1){
try {
sem_wrt.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
sem.release();
System.out.println("Reading "+a);
try {
sem.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
readercount--;
if(readercount==0){
sem_wrt.release();
}
sem.release();
}
}
class writer implements Runnable{
public writer(){
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
sem_wrt.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a=a+"abc";
System.out.println("Writing "+a);
sem_wrt.release();
}
}
for(int i=1;i<=10;i++){
new Thread(new writer()).start();
new Thread(new reader()).start();
}
}
}
- 上一篇:Java从控制台中读取数据方法
- 下一篇:什么是探索性软件测试
更多郑州哪个学校计算机专业好,郑州中专哪个学校好,河南省计算机专业中专有哪些学校,河南鹤壁学电脑好的学校,郑州技校排名技校都有什么专业,河南计算机专业大专学校哪家好相关文章
- Java多线程notify ifyall的区别
- 专访史亮:带你走进探索式测试
- Andor参数化测试框架改造
- 接口测试原则之测试代码中的判断
- 成功的自动化测试:敏捷测试员与程序员之间的合作
- 软件测试转型之路
- HADOOP测试常见问题和测试方法
- 谈关于最近软件测试的面试
- 软件测试人员的职业发展的讨论
- 拒绝场景遗漏之精准回归(一)
- 对话马丁·福勒(Martin Fowler)——第五部分:测试驱动开发
- 北大青鸟软件测试课程
- 同行评审那些事儿(九):最佳实践(2)
- 质量管理漫漫谈之影响软件产品质量的因素
- 同行评审那些事儿(三):需求与设计评审的特点
- 质量保证漫漫谈之SQA的工作职责和工作方式
- 在软件发布之前如何预估残留缺陷?
- 电脑中的480P、720P、1080P是什么意思
- 导致硬盘产生坏道的原因
- 智能手机瞬间掉电百分之十的秘密
- 电脑核心部件CPU知识
- BIOS基础知识
- Windows常用的文件扩展名
- 电脑里哪些文件属于垃圾文件
- 购买品牌电脑注意事项
- win7创建还原点在哪?
- 系统U盘挑选技巧
- 学完软件开发后能做什么工作
- 软件测试工程师从业者需要走哪些路?
- 搜索
-
- 热门标签