⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java08_04.htm

📁 JAVA的课件
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Java程序设计</title>
</head>

<body background="Bg.gif">

<p align="center"><font size="5"><b>§8.4线程的同步与死锁</b></font></p>

<p align="left">&nbsp;&nbsp;&nbsp; 
和进程一样,多线程的程序也要考虑各个线程之间的协调和配合。特别是当线程要共享资源时,就必须考虑线程之间的互斥、同步问题,如果编写不当,就有可能发生死锁。关于互斥、同步、死锁、临界区这些概念,在操作系统中已经讲得很清楚,请大家回顾。</p>
<p align="left">&nbsp;&nbsp;&nbsp; 
在操作系统中,为了解决进程间的互斥、同步,必须要使用PV原语,而在Java中,系统提供了和PV原语类似的两个方法:<br>
&nbsp;&nbsp;&nbsp; public final void wait()<br>
&nbsp;&nbsp;&nbsp; public final void notify()<br>
以及配套使用的一个关键字:synchronized。</p>
<p align="left">&nbsp;&nbsp;&nbsp; 注意,上面两个方法是object类的成员方法,由于该类是所有类的基类,所以在任何类中,可以直接使用这两个方法而无须用对象名.方法名()的格式。<br>
&nbsp;&nbsp;&nbsp; wait()是将本线程转入阻塞状态,它和sleep()不同,它会暂时释放占用的资源管程。notify()则是唤醒某个在管程队列中排队等候的线程。而synchronized关键字则用来标志被同步使用的资源,这里的资源既可以是数据,也可以是方法,甚至是一段代码。凡是被synchronized修饰的的代码段,系统都会为它分配一个管程,这样就能保证在某一时间内,只有一个线程在享有这一资源。</p>
<p align="left">&nbsp;&nbsp;&nbsp; 
下面实现了操作系统中一个经典的问题:生产者-消费者问题。</p>
<p align="left">class common{<br> 
&nbsp;&nbsp;&nbsp; private int production;<br> 
&nbsp;&nbsp;&nbsp; private boolean signal=false;<br> 
<br>
&nbsp;&nbsp;&nbsp; <b>synchronized</b> int get(){ //注意这个关键字<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int result;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下面这个相当于P原语<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!signal)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
wait();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(InterruptedException e) {  }<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下面这段相当于V原语<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal=false;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result=production;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; production=-1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notify();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br> 
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; synchronized void put(int newproduct){<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (signal)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
wait();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(InterruptedException e) {  }<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; production=newproduct;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal=true;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notify();&nbsp;<br>
&nbsp;&nbsp;&nbsp; }&nbsp;<br>
}</p>
<p align="left">class producer extends Thread{<br> 
&nbsp;&nbsp;&nbsp; private common comm;<br> 
&nbsp;&nbsp;&nbsp; public producer(common thiscomm){<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comm=thiscomm;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; public void run(){<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=100;i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { comm.put(i);<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("生产的数据是:"+i);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
</p>
<p align="left">class consumer extends Thread{<br> 
&nbsp;&nbsp;&nbsp; private common comm;&nbsp;<br>
&nbsp;&nbsp;&nbsp; public consumer (common thiscomm){<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comm=thiscomm;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; public void run(){<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i,production;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=100;i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { production=comm.get();<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("得到的数据是:"+production);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br>
&nbsp;&nbsp;&nbsp; }&nbsp;<br>
}<br>
</p>
<p align="left">public class producer_consumer{<br> 
&nbsp;&nbsp;&nbsp; public static void main(String argv[]){<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; common comm=new common();<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; producer p=new producer(comm);<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; consumer c=new consumer(comm);<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.start();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.start();<br>
&nbsp;&nbsp;&nbsp; }<br>
}</p>
<p align="left">&nbsp;&nbsp;&nbsp; 
从输出结果可以看到,它很好地解决了生产者线程和消费者线程间的同步问题。同学们可以依据此程序写出更为复杂的同步程序。</p>
<p align="left"><a href="index.htm">回目录</a>   <a href="java08_03.htm">上一课</a> 
</p>

</body>

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -