JDK5新特性之執行緒鎖技術(二)

2021-06-26 15:31:11 字數 2373 閱讀 5403

一. lock實現執行緒同步互斥

lock比傳統執行緒模型中的synchronized方式更加物件導向,與生活中的鎖類似,鎖本身也是乙個物件。

兩個執行緒執行的**片段要實現同步互斥的效果,他們必須用同乙個lock物件。鎖是上在代表要操作的資源的類的內部方法中,

而不是執行緒**中。

public class locktest 

private void init() catch (exception e) }}

}).start();

// 執行緒2

new thread(new runnable() catch (exception e) }}

}).start();

} class outputer

system.out.println();

} finally

} }

}

二. 讀寫鎖實現執行緒同步互斥

讀寫鎖分為讀鎖和寫鎖,多個讀鎖不互斥,讀鎖和寫鎖互斥,寫鎖與寫鎖互斥,這是由jvm自己控制的,我們只要上好相應的鎖即可。

如果你的**唯讀資料,可以很多人同時讀,但不能同時寫,那就上讀鎖;如果你的**要修改資料,那只能有乙個人在寫,且不能同時讀取,那就上寫鎖。

總之:讀的時候上讀鎖,寫的時候上寫鎖

/**

* 讀寫鎖的案例

*/public class readwritelocktest

}}.start();

new thread()

}}.start();

} }}class queues catch (interruptedexception e) finally

} // 寫的方法:用的是寫鎖writelock()

public void put(object data) catch (interruptedexception e) finally

}}

注意:釋放鎖的**一定要放在finally裡面,防止出現不可預知的異常的時候無法釋放資源。

三. 讀寫鎖的典型應用

/**

* 快取的簡單實現

*/public class cachedemo

} finally

// 釋放寫鎖後,恢復讀鎖

rwl.readlock().lock();

} } finally

return value;

} }

疑問:為何上寫鎖前要釋放讀鎖?為何釋放寫鎖後要重新上讀鎖?

我們可以這樣把物件鎖看成現實中的門閂,一扇門只能有乙個門閂。所以上寫的門閂要釋放讀的門閂。

四. condition實現執行緒同步通訊

condition的功能類似傳統執行緒技術中的object.wait和object.notify功能, 乙個鎖累不可以有多個condition, 即有多路等待和通知.

傳統執行緒機制中乙個監視器物件上只有一路等待和通知, 要想實現多路等待和通知, 就必須使用多個同步監視器物件:

/**

* 三個condition通訊的場景

*/public class threeconditioncommunication

}}).start();

// 執行緒2

new thread(new runnable()

}}).start();

// 執行緒3

new thread(new runnable()

}}).start();

} static class business

for (int j = 1; j <= 10; j++)

flag = 2;

condition2.signal();

} catch (exception e) finally

} public void sub2(int i)

for (int j = 1; j <= 10; j++)

flag = 3;

condition3.signal();

} catch (exception e) finally

} public void sub3(int i)

for (int j = 1; j <= 10; j++)

flag = 1;

condition1.signal();

} catch (exception e) finally

} }}

JDK5新特性 列舉

一些程式在執行時,他需要的資料不能是任意的,而必須是一定範圍內的值,jdk5以前採用自定義類來解決,jdk5以後可以直接採用列舉解決。在jdk5之後,使用enum關鍵字定義一種新的型別,稱為列舉型別。enum類和enum關鍵字 使用enum關鍵字定義的列舉類,實際上就相當於定義了乙個類,此類繼承了e...

JDK5新特性之執行緒同步工具類(三)

一.semaphore實現訊號燈 semaphore可以控制同時訪問資源的執行緒個數,例如 實現乙個檔案允許的併發訪問數.semaphore實現的功能就類似廁所有5個坑,加入有十個人要上廁所,那麼同時只能有5個人能夠占用,當5個人中的任何乙個人離開後,其中在等待的另外5個人中就有乙個可以占用了.另外...

JDK5的新特性可變引數

package cn.itcast 06 可變引數 在定義方法的時候我不知道定義多少個元素 格式 修飾符 返回值型別 方法名 資料型別.變數名 注意 這裡的變數是乙個陣列 如果乙個方法有可變引數,並且有多個引數,那麼,可變引數一定是最後乙個 因為可變引數前面的依次賦值,剩下的全部給可變引數 publ...