一. 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...