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格式閱讀原文。

主站蜘蛛池模板: 色综合久久久久8天国| 在线播放精品一区二区啪视频| 尤物午夜福利视频| 国产成人高清精品免费| 亚洲欧美不卡中文字幕| 欧美亚洲另类在线观看| 91在线免费公开视频| 国产精品毛片在线直播完整版| 最新国产精品第1页| 国产亚洲欧美日韩在线观看一区二区| 亚洲国产亚洲综合在线尤物| 五月天在线网站| 97精品久久久大香线焦| 青青操视频在线| www精品久久| 成人国产免费| 亚洲国产成人在线| 欧美日一级片| 亚洲天堂久久久| 无码有码中文字幕| 一区二区三区四区日韩| 亚洲高清在线天堂精品| 国产精品亚洲一区二区在线观看| 青青青视频免费一区二区| 少妇极品熟妇人妻专区视频| 国产极品美女在线观看| 99国产在线视频| 免费看美女毛片| 亚洲永久色| 国产成人艳妇AA视频在线| 久久五月天国产自| 欧美一级99在线观看国产| 午夜视频免费试看| 伊人久久大香线蕉影院| 制服丝袜国产精品| 综合社区亚洲熟妇p| 青青青国产免费线在| 91伊人国产| 99re免费视频| 热re99久久精品国99热| 国产精品短篇二区| 久久午夜夜伦鲁鲁片无码免费| 亚洲精品日产精品乱码不卡| 国产在线一二三区| 美女被操黄色视频网站| 免费国产不卡午夜福在线观看| 欧美精品在线视频观看| 精品国产一区二区三区在线观看| 亚洲视频欧美不卡| 3D动漫精品啪啪一区二区下载| 久久人妻xunleige无码| 亚洲系列中文字幕一区二区| 国产精品99在线观看| 国产精品综合久久久| 亚洲婷婷丁香| 欧美成人一级| 色婷婷久久| 国产黑丝一区| 欧美一区二区啪啪| 99久久精品视香蕉蕉| 四虎永久免费地址| 在线国产毛片| 成人亚洲国产| 孕妇高潮太爽了在线观看免费| 色综合国产| 欧美怡红院视频一区二区三区| 免费一级毛片在线播放傲雪网| 国产成人亚洲精品色欲AV| 好吊色妇女免费视频免费| 少妇精品网站| 99精品热视频这里只有精品7| 在线免费看片a| 国产精品视频999| 亚洲一级色| 国产簧片免费在线播放| 亚洲人在线| 亚洲中文字幕久久无码精品A| 欧美国产综合视频| 亚洲无码91视频| 亚亚洲乱码一二三四区| 亚洲国产黄色| 91网址在线播放|