- 同步控制:是指同一資源只能同時(shí)被一個(gè)對(duì)象調(diào)用,當(dāng)這個(gè)對(duì)象調(diào)用結(jié)束后才能被其他的對(duì)象調(diào)用
- 在所要調(diào)用的方法前加上synchronized
- 例:synchronized char get(){};
*注意的是:1.當(dāng)用synchronized注釋多個(gè)方法的時(shí)候,使得這些方法“連在一起”
- 當(dāng)有一對(duì)象調(diào)用其中的一個(gè)方法的時(shí)候,別的對(duì)象無(wú)法對(duì)其他的方法進(jìn)行調(diào)用
-
- 2.標(biāo)識(shí)的資源可以是一種類型的數(shù)據(jù),也就是對(duì)象,也可以是一個(gè)方法,也可以是一段代碼
- 當(dāng)我們對(duì)整個(gè)類進(jìn)行標(biāo)識(shí)的時(shí)候,就會(huì)使得這類之中的所有的東西同一時(shí)間只能被一個(gè)對(duì)象調(diào)用
-
- 3.當(dāng)我們編寫(xiě)程序的時(shí)候最好將定義同步的類和實(shí)現(xiàn)其他的方法的類分開(kāi),以免弄混,使得程序出錯(cuò)
/**
* @Author 李騰飛
*/
class Common{//定義同步資源
private char ch;
private boolean available=false;
synchronized char get(){
while(available==false)
try
{
wait();//當(dāng)沒(méi)有產(chǎn)品時(shí),一直掛起,不能進(jìn)行售賣(mài)
}
catch (InterruptedException e){}
available=false;
notify();
return ch;
}
synchronized void put(char newch){//當(dāng)對(duì)象調(diào)用這個(gè)方法的時(shí)候就會(huì)得到互斥鎖,使之避免多個(gè)線程對(duì)同一自資源的訪問(wèn)
while(available==true)
try
{
wait();//當(dāng)有產(chǎn)品的時(shí)候,就一直掛起,不進(jìn)行上架
}
catch(InterruptedException e){}
ch=newch;
available=true;
notify();
}
}
class Produce extends Thread {
private Common comm;
public Produce(Common thiscomn){
comm=thiscomn;
}
public void run(){
char c;
for (c='a';c<'e';c++){
System.out.println("生產(chǎn)的數(shù)據(jù)是:"+c);
comm.put(c);
}
}
}
class Consumer implements Runnable{
private Common comm;
public Consumer(Common thisComm) {
comm = thisComm;
}
public void run(){
char c;
for (int i=0; i<5;i++){
c=comm.get();
System.out.println("消費(fèi)者得到的數(shù)據(jù)是:"+c);
}
}
}
public class 線程同步控制 {
public static void main(String[] args) {
Common comm = new Common();
Produce p = new Produce(comm);
Consumer c = new Consumer(comm);
p.start();
new Thread(c).start();//注意此時(shí)的激活程序只能放在main函數(shù)之中
}}
注意激活線程時(shí)的注意點(diǎn):
Consumer v=new Consumer(comm);
此時(shí)的V雖然是實(shí)現(xiàn)Runnable接口的類的對(duì)象,但是Thread之中的很多方法卻不能夠進(jìn)行使用
想要使用 Thread的方法就要重新定義一個(gè)Thread線程,將所建的對(duì)象作為參數(shù)放入其中
此時(shí)參數(shù)的run()方法就會(huì)被線程所調(diào)用
new Thread(v).start();//創(chuàng)建Thread類的匿名對(duì)象,將v作為參數(shù)放入其中,再調(diào)用start方法將線程激活
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。