999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Java中同步線程的實(shí)現(xiàn)

2007-12-31 00:00:00劉學(xué)超楊宏偉李玉霜
商場現(xiàn)代化 2007年10期

[摘要] 本文介紹了線程及其運(yùn)行機(jī)理,探討了Java線程的設(shè)計(jì)方法,并就Java線程設(shè)計(jì)中的關(guān)鍵問題即同步線程的實(shí)現(xiàn)問題提出了四種解決方案。

[關(guān)鍵詞] 線程 多線程 同步

一、線程相關(guān)概念

所謂“線程”(Thread),是“進(jìn)程”中某個單一順序的控制流。而多線程是這樣一種機(jī)制,它允許在程序中并發(fā)執(zhí)行多個指令流,每個指令流都稱為一個線程,彼此間互相獨(dú)立。線程又稱為輕量級進(jìn)程,它和進(jìn)程一樣擁有獨(dú)立的執(zhí)行控制,由操作系統(tǒng)負(fù)責(zé)調(diào)度,區(qū)別在于線程沒有獨(dú)立的存儲空間,而是和所屬進(jìn)程中的其它線程共享一個存儲空間,這使得線程間的通信較進(jìn)程簡單。

多個線程的執(zhí)行是并發(fā)的,也就是在邏輯上“同時”,而不管是否是物理上的“同時”。如果系統(tǒng)只有一個CPU,那么真正的“同時”是不可能的,但是由于CPU的速度非???,用戶感覺不到其中的區(qū)別,因此我們也不用關(guān)心它,只需要設(shè)想各個線程是同時執(zhí)行即可。

多線程和傳統(tǒng)的單線程在程序設(shè)計(jì)上最大的區(qū)別在于,由于各個線程的控制流彼此獨(dú)立,使得各個線程之間的代碼是亂序執(zhí)行的,由此帶來的線程調(diào)度、同步等問題,接下來我們就對Java中對線程設(shè)計(jì)與同步問題進(jìn)行探討。

二、線程的設(shè)計(jì)方法

創(chuàng)建線程主要有兩種形式:一種是繼承自Thread類。要創(chuàng)建一個線程,必須創(chuàng)建一個從 Thread 類導(dǎo)出的新類。通過覆蓋 Thread的run()函數(shù)來完成有用的工作。但用戶通過調(diào)用Thread的start() 函數(shù)調(diào)用run()。

例:

public class Ctest extends Thread

{

public Ctest()

{…}

public static void main(String args[])

{Ctest t1=new Ctest();

t1.start();}

public void run()

{….}

}

另一種是實(shí)現(xiàn)Runnable接口,此接口只有一個函數(shù)run(),它由實(shí)現(xiàn)此接口的類實(shí)現(xiàn)。

例:

public class Ctest implements Runnable

{ Thread thread1;

public Ctest()

{ thread1=new Thread(this,\"1\");}

public static void main(String args[])

{Ctest t=new Ctest();

t.startThreads(); }

public void run()

{…}

public void startThreads()

{ thread1.start(); }

}

兩種創(chuàng)建方式差別不大,第一種因?yàn)槔^承自Thread,只創(chuàng)建了自身對象;第二種還得創(chuàng)建Thread對象。但是當(dāng)你想繼承某一其他類時,只能用后一種方式。

三、同步線程實(shí)現(xiàn)

線程的創(chuàng)建雖然只有兩種形式,但是利用這兩種形式我們可以在同一進(jìn)程中設(shè)計(jì)多個線程;多個線程并發(fā)執(zhí)行,極大地提高的程序的運(yùn)行效率。但是許多線程在執(zhí)行中必須考慮與其他線程之間共享數(shù)據(jù)或協(xié)調(diào)執(zhí)行狀態(tài),否則會出現(xiàn)沖突。

解決沖突的很好辦法就是在設(shè)計(jì)中引入同步機(jī)制。在Java中每個對象都有一把鎖與之對應(yīng)。但Java不提供單獨(dú)的lock和unlock操作。它由高層的結(jié)構(gòu)隱式實(shí)現(xiàn),,保證操作的對應(yīng)。

synchronized語句計(jì)算一個對象引用,試圖對該對象完成鎖操作,并在完成鎖操作前停止處理。當(dāng)鎖操作完成synchronized語句體得到執(zhí)行;當(dāng)語句體執(zhí)行完畢(無論正?;虍惓?,解鎖操作自動完成。作為面向?qū)ο蟮恼Z言,synchronized經(jīng)常與方法連用。一種比較好的辦法是,如果某個變量由一個線程賦值并由別的線程引用或賦值,那么所有對該變量的訪問都必須在某個synchronized語句或方法內(nèi),具體方法如下:

(1)方法聲明時使用,放在范圍操作符之后,返回類型聲明之前。

這時線程獲得的是成員鎖,即一次只能有一個線程進(jìn)入該方法,其他線程要想在此時調(diào)用該方法,只能排隊(duì)等候,當(dāng)前線程執(zhí)行完該方法后,別的線程才能進(jìn)入。

例:public synchronized void synMethod()

(2)對某一代碼塊使用,synchronized后跟括號,括號里是變量,一次只有一個線程進(jìn)入該代碼塊。此時,線程獲得的是成員鎖。例:

public int synMethod(int a1)

{synchronized(a1)

}

(3)synchronized后面括號里是一對象,此時線程獲得的是對象鎖。

例:

public class MyThread implements Runnable

{public static void main(String args[])

{MyThread mt=new MyThread();

Thread t2=new Thread(mt, \"t2\");

t2.start();

}

public void run()

{synchronized (this)

{System.out.println(Thread.currentThread().getName());}

}}

對于(3),如果線程進(jìn)入,則得到當(dāng)前對象鎖,那么別的線程在該類所有對象上的任何操作都不能進(jìn)行。

(4)synchronized后面括號里是類,此時,線程獲得的是對象鎖,例:

class ArrayWithLockOrder{

private static long num_locks=0;

private long lock_order;

private int[] arr;

public ArrayWithLockOrder(int[] a)

{arr=a;

synchronized(ArrayWithLockOrder.class){

num_locks++;

lock_order=num_locks;

}

}

public long lockOrder()

{return lock_order;}

public int[] array()

{return arr;}

}

class SomeClass implements Runnable

{public int sumArrays(ArrayWithLockOrder a1,ArrayWithLockOrder a2)

{int value = 0;

ArrayWithLockOrder first = a1;

ArrayWithLockOrder last = a2;

int size=a1.array().length;

if (size==a2.array().length)

{

if (a1.lockOrder()>a2.lockOrder())

{first=a2;

last=a1;}

synchronized(first){

synchronized(last){

int[] arr1=a1.array();

int[] arr2=a2.array();

for(int i=0;i

value+=arr1[i]+arr2[i];

}}}

return value;

}

public void run()

{...}

}

對于(4),如果線程進(jìn)入,則線程在該類中所有操作不能進(jìn)行,包括靜態(tài)變量和靜態(tài)方法。對于含有靜態(tài)方法和變量的代碼塊的同步,常用(4)來加鎖。

四、小結(jié)

多線程機(jī)制可以同時運(yùn)行好幾個程序塊,使程序運(yùn)行的效率變得更高,也可克服傳統(tǒng)程序語言無法設(shè)計(jì)的問題,其設(shè)計(jì)的關(guān)鍵在于同步線程的實(shí)現(xiàn)。除此之外,還需檢查所有可能Block的地方,盡可能多的使用sleep或yield( )以及wait( ),盡可能延長sleep的時間,運(yùn)行的線程不用超過100個,使多線程真正服務(wù)于程序員。

本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。

主站蜘蛛池模板: 秋霞午夜国产精品成人片| 日韩一区二区三免费高清| 国内黄色精品| 国内精品自在自线视频香蕉| 欧美精品另类| 青青操国产| 午夜精品影院| 亚洲中文字幕av无码区| 久操线在视频在线观看| 青青草国产在线视频| 国产午夜精品鲁丝片| 亚洲第一成年免费网站| 欧美精品啪啪| 欧美一级99在线观看国产| 国产精品免费p区| 久久6免费视频| 免费中文字幕一级毛片| 福利片91| 亚洲午夜福利精品无码不卡| 538国产视频| 国产青榴视频| 国产在线视频导航| 人妻精品全国免费视频| 波多野结衣久久精品| 国产成人综合日韩精品无码首页 | 国产成人AV男人的天堂| 国产精品亚洲αv天堂无码| 亚洲中文无码h在线观看| 国产高清不卡视频| 青青青视频蜜桃一区二区| 99热国产这里只有精品无卡顿"| 国产91小视频在线观看| 91丨九色丨首页在线播放| 毛片在线播放a| 动漫精品中文字幕无码| 无码AV高清毛片中国一级毛片| 92午夜福利影院一区二区三区| 亚洲精品欧美日韩在线| 欧美无专区| 国内毛片视频| 在线观看国产精品第一区免费| 久久夜色精品国产嚕嚕亚洲av| 色网站在线免费观看| 另类专区亚洲| 国产小视频网站| 国产免费人成视频网| 青青青伊人色综合久久| 国产亚洲精久久久久久无码AV| 国产三级毛片| 久草美女视频| 日本人又色又爽的视频| 美女无遮挡免费视频网站| 成人午夜视频免费看欧美| 国产情精品嫩草影院88av| 色综合久久88色综合天天提莫| 国产97区一区二区三区无码| 亚洲日本www| 青青久久91| 免费看a毛片| 色悠久久久| 真实国产精品vr专区| 国产又爽又黄无遮挡免费观看| 欧美性久久久久| 福利视频久久| 欧美a级在线| 亚洲最新地址| 亚洲大尺码专区影院| 精品无码一区二区三区电影| 国产一区在线视频观看| 2020最新国产精品视频| 亚洲天堂视频在线播放| 久久综合干| 五月天综合婷婷| 国产黑丝一区| 在线观看国产黄色| 一级毛片高清| 国产91精品调教在线播放| 午夜精品久久久久久久99热下载 | 国产精品福利导航| 婷婷六月综合网| 99在线视频免费| 欧洲成人免费视频|