天天看點

Lock對象和synchronized關鍵字的差別

public class TestLock {

	public static void main(String[] args) throws Exception {
		MyList2 list = new MyList2();
		Thread t1 = new Thread(new Runnable(){
			public void run(){
				list.add("C");
			}
		});
		Thread t2 = new Thread(new Runnable(){
			public void run(){
				list.add("D");
			}
		});
		t1.start();
		t2.start();
		
		t1.join();
		t2.join();
		list.add("E");
		list.print();
	}

}
class MyList2{
	String[] data = {"A","B","","","",""};
	int index = 2;
	Lock lock = new ReentrantLock();		//建立Lock對象	控制多線程同步的鎖
	
	public void add(String s){
		try{
			
			//synchronized 的壞處  死鎖問題  線程死等
			lock.lock();	//上鎖 對鎖對象調用lock方法 進入同步代碼塊
			//lock.tryLock();	//嘗試拿鎖  提高并發效率  不會阻塞線程  傳回值true/false
			//lock.tryLock(long time,TimeUnit unit);	//給線程一個等待的時間
			data[index] = s ; 
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			index++;
		}
		finally{
			lock.unlock();	//解鎖	對鎖對象調用unlock方法 離開同步代碼塊
		}
	}
	public void print(){
		for(int i = 0 ; i < data.length ; i++){
			System.out.println(data[i]);
		}
	}
}
           
Lock對象和synchronized關鍵字的差別
Lock對象和synchronized關鍵字的差別

這輩子堅持與不堅持都不可怕,怕的是獨自走在堅持的道路上!!!

繼續閱讀