操作系统实验一:并发程序设计
一、实验目的
(1)加深对进程并发执行的理解,认识多进程并发执行的实质。
(2)观察进程共享资源的现象,学习解决进程互斥和同步的方法。
二、实验要求:
本实验要求用高级语言,启动多进程并发运行,设计相应代码,显示进程无关并发、进程共享变量并发的运行结果。并完成实验报告。
三、实验内容:
分别实现以下四种情况的并发:
1.并发的进程之间无关,显示进程名称,开始与结束时间。
模拟多终端售票情况,并发的多个终端进程之间共享剩余票数这个共享变量。
2.用全局变量实现。
3.用进程间共享数据机制实现。
4.用进程间共享数据机制和加锁机制实现。
四、实验过程与结果
- 算法思想与设计
- 算法实现代码
- 运行结果
public class SellTicket implements Runnable{ public static void main(String[] agrs){ Object A = "A";//对象A的锁 Object B = "B";//对象B的锁 Object C = "C"; SellTicket sA = new SellTicket(C,A); SellTicket sB = new SellTicket(A,B); SellTicket sC = new SellTicket(B,C); Thread tA = new Thread(sA,"A线程"); Thread tB = new Thread(sB,"B线程"); Thread tC = new Thread(sC,"C线程"); tA.start(); try{ Thread.sleep(100); }catch (InterruptedException e){ e.printStackTrace(); } tB.start(); try{ Thread.sleep(100); }catch (InterruptedException e){ e.printStackTrace(); } tC.start(); try{ Thread.sleep(10000); }catch(InterruptedException e){ e.printStackTrace(); } synchronized(B){ B.notify(); } } public static int count = 10;//全局票数 public volatile boolean why = true; private Object prev; private Object self; public SellTicket(Object prev,Object self){ this.prev = prev; this.self = self; } @Override public void run(){ while(print()); } private boolean print(){ while(count > 0){ synchronized (prev) { synchronized (self){ System.out.println(Thread.currentThread().getName() + "卖出第:" + count-- + "张,剩余"+count+"张"); count --; System.out.println(Thread.currentThread().getName()+ self + ".notify"); self.notify(); } if(!(count==0)){ try{ System.out.println(Thread.currentThread().getName() + prev + ".wait"); prev.wait(); } catch (InterruptedException e){ e.printStackTrace(); } } } System.out.println(Thread.currentThread().getName()+"return true"); return true; } System.out.println(Thread.currentThread().getName()+"return false"); return false; }}

浙公网安备 33010602011771号