国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

java 線程安全

2019-11-17 06:33:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 

四種方式    sychronized要害字

  1. sychronized method(){}
  2. sychronized (objectReference) {/*block*/}
  3. static synchronized method(){}
  4. sychronized(classname.class)

其中1和2是代表鎖當(dāng)前對(duì)象,即一個(gè)對(duì)象就一個(gè)鎖,3和4代表鎖這個(gè)類,即這個(gè)類的鎖
要注重的是sychronized method()不是鎖這個(gè)函數(shù),而是鎖對(duì)象,即:假如這個(gè)類中有兩個(gè)方法都是sychronized,那么只要有兩個(gè)線程共享一個(gè)該類的reference,每個(gè)調(diào)用這兩個(gè)方法之一,不管是否同一個(gè)方法,都會(huì)用這個(gè)對(duì)象鎖進(jìn)行同步。鎖的3和4類推,即該類的不同reference調(diào)用了sychronized區(qū)段的咚咚就會(huì)受類鎖的控制

還有,假如兩個(gè)函數(shù)調(diào)用的先后順序不能被打斷,那么可以有個(gè)專門的鎖對(duì)象來(lái)完成這個(gè)任務(wù):
class MyLock
{
      synchronized getLock()
      {
          //####還沒(méi)寫完
      }
}

五個(gè)等級(jí)   參見effective java  Item 52 : Document thread safety

  1. immutable   不可變對(duì)象
  2. thread-safe 線程安全的,可以放心使用,如java.util.Timer
  3. conditionally thread-safe 條件線程安全的,如Vector和Hashtable,一般是安全的,除非存在幾個(gè)方法調(diào)用之間的順序不能被打斷,這時(shí)可以用額外的鎖來(lái)完成
  4. thread-compatible 可以使用synchronized (objectReference)來(lái)協(xié)助完成對(duì)線程的調(diào)用
  5. thread-hostile 不安全的

wait & notifyAll

在循環(huán)中使用wait 使用notifyAll而不是notify

pipe

java中也有pipe的,四個(gè)類:PipedInputStream, PipedInputReader, PipedOutputStream, PipedOutputWriter 下面是一段生產(chǎn)者消費(fèi)者的代碼(摘自core javaII):

    /* set up pipes */
    PipedOutputStream pout1 = new PipedOutputStream();
    PipedInputStream pin1 = new PipedInputStream(pout1);
    PipedOutputStream pout2 = new PipedOutputStream();
    PipedInputStream pin2 = new PipedInputStream(pout2);
    /* constrUCt threads */
    PRoducer prod = new Producer(pout1);
    Filter filt = new Filter(pin1, pout2);
    Consumer cons = new Consumer(pin2);
    /* start threads */
    prod.start(); filt.start(); cons.start();

注重

long 和double是簡(jiǎn)單類型中兩個(gè)非凡的咚咚:java讀他們要讀兩次,所以需要同步
死鎖是一個(gè)經(jīng)典的多線程問(wèn)題,因?yàn)椴煌木€程都在等待那些根本不可能被釋放的鎖,從而導(dǎo)致所有的工作都無(wú)法完成。假設(shè)有兩個(gè)線程,分別代表兩個(gè)饑餓的人,他們必須共享刀叉并輪流吃飯。他們都需要獲得兩個(gè)鎖:共享刀和共享叉的鎖。假如線程 "A" 獲得了刀,而線程 "B" 獲得了叉。線程 A 就會(huì)進(jìn)入阻塞狀態(tài)來(lái)等待獲得叉,而線程 B 則阻塞來(lái)等待 A 所擁有的刀。這只是人為設(shè)計(jì)的例子,但盡管在運(yùn)行時(shí)很難探測(cè)到,這類情況卻時(shí)常發(fā)生。雖然要探測(cè)或推敲各種情況是非常困難的,但只要按照下面幾條規(guī)則去設(shè)計(jì)系統(tǒng),就能夠避免死鎖問(wèn)題:
  • 讓所有的線程按照同樣的順序獲得一組鎖。這種方法消除了 X 和 Y 的擁有者分別等待對(duì)方的資源的問(wèn)題。
  • 將多個(gè)鎖組成一組并放到同一個(gè)鎖下。前面死鎖的例子中,可以創(chuàng)建一個(gè)銀器對(duì)象的鎖。于是在獲得刀或叉之前都必須獲得這個(gè)銀器的鎖。
  • 將那些不會(huì)阻塞的可獲得資源用變量標(biāo)志出來(lái)。當(dāng)某個(gè)線程獲得銀器對(duì)象的鎖時(shí),就可以通過(guò)檢查變量來(lái)判定是否整個(gè)銀器集合中的對(duì)象鎖都可獲得。假如是,它就可以獲得相關(guān)的鎖,否則,就要釋放掉銀器這個(gè)鎖并稍后再嘗試。
  • 最重要的是,在編寫代碼前認(rèn)真仔細(xì)地設(shè)計(jì)整個(gè)系統(tǒng)。多線程是困難的,在開始編程之前具體設(shè)計(jì)系統(tǒng)能夠幫助你避免難以發(fā)現(xiàn)死鎖的問(wèn)題。
Volatile 變量. volatile 要害字是 Java 語(yǔ)言為優(yōu)化編譯器設(shè)計(jì)的。以下面的代碼為例:


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 濉溪县| 左云县| 宁波市| 嘉峪关市| 庐江县| 泸溪县| 兴安盟| 南皮县| 沙雅县| 同德县| 龙口市| 克什克腾旗| 曲周县| 孟津县| 泰安市| 天全县| 关岭| 垣曲县| 黄骅市| 祁门县| 北京市| 长阳| 腾冲县| 都江堰市| 南澳县| 大名县| 民县| 松溪县| 安平县| 汝城县| 黄骅市| 商南县| 霍州市| 桓台县| 城固县| 澄江县| 苍梧县| 方城县| 娱乐| 黔江区| 伊春市|