Java5併發庫的鎖位於java.util.concurrent.locks包,鎖的做用很是相似於傳統線程中的synchronizd(相關的例子能夠參見http://020618.blog.51cto.com/6098149/1182775),與synchronizd相比,鎖(lock)更加地面向對象,它主要用於互斥,與生活中的鎖相似,鎖自己也是一個對象,兩個線程執行的代碼片斷要實現同步互斥的效果,他們必須用同一個Lock對象。鎖是上在表明要操做的資源的類的內部方法中,而不是線程的代碼中。下面經過代碼看一下鎖的簡單使用。java
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class LockTest {
- public static void main(String[] args) {
- new LockTest().init();
- }
- private void init(){
- final Outputer outputer = new Outputer();
- new Thread(new Runnable(){
- @Override
- public void run() {
- while(true){
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- outputer.output("gaohao");
- }
- }
- }).start();
- new Thread(new Runnable(){
- @Override
- public void run() {
- while(true){
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- outputer.output("howdoyoudo");
- }
- }
- }).start();
- }
- static class Outputer{
- //定義一個鎖對象,它是一個接口,new它的實現類
- Lock lock = new ReentrantLock();
- public void output(String name){
- int len = name.length();
- lock.lock();//一個線程進入的時候,鎖上,其它的線程搶佔同一個鎖時,其它的線程不能進
- try{
- for(int i=0;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }finally{//必定會執行的代碼
- lock.unlock();//正常或非正常退出,都應該把鎖釋放,不然會致使死鎖
- }
- }
- //使用synchronized實現互斥的方法
- /*public synchronized void output2(String name){
- int len = name.length();
- for(int i=0;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }*/
- }
- }
程序運行的結果:併發
能夠看到,利用鎖(Lock)一樣實現互斥的效果,兩個線程不斷的打印兩條完整的信息,他們彼此不會被對方打斷。ide