JDKロックの件

2860 ワード

なぜロックが必要ですか?(1)マルチタスク環境でのみ必要である;(2)タスクは同じ共有リソースに対して書き込み操作を行う必要がある;(3)リソースへのアクセスは反発する;
ロックにはどのようなライフサイクルがありますか?(1)競合によってロックを取得してこそ、そのリソースを操作することができる(競合ロック);(2)あるタスクがリソースを更新している場合(ロックがかかっている);(3)他のタスクは、そのリソースを操作できない(タスクブロック);(4)タスクが更新を完了するまで(ロックが解除される);
シミュレーションシーン(列車の切符100枚販売)
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//          100    ,       
//   java    Runnable     
public class TicketTest implements Runnable{
	
	private int count = 100;
	//    jvm        ,             ,               
	//       ,         ,    jvm      
	//                   ,         ,       
	//private static int count = 100;//        
	
	private Lock lock = new ReentrantLock();
	//java                  juc   
	
	public static void main(String[] args) {	
		TicketTest t = new TicketTest();
		//          
		Thread t1 = new Thread(t,"  A");
		Thread t2 = new Thread(t,"  B");
		Thread t3 = new Thread(t,"  C");
		Thread t4 = new Thread(t,"  D");
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
	
	public void run() {
		while(count > 0) {
			
//			//      ,       ,     ,  
//			if(count > 0) {//    
//				System.out.println(Thread.currentThread().getName()+
//						"   "+
//						count+
//						"    ");
//				count--;
//			}
//			try {
//				Thread.sleep(50);//  50  
//			} catch (Exception e) {
//				// TODO: handle exception
//			}

			
//			//   ,  ,  “     “      ,             
//			synchronized(this){
//				if(count > 0) {//    
//					System.out.println(Thread.currentThread().getName()+
//							"   "+
//							count+
//							"    ");
//					count--;
//				}
//			}
//			try {
//				Thread.sleep(50);//  50  
//			} catch (Exception e) {
//				// TODO: handle exception
//			}
			
			
//			//   ,      synchronized
//			sale();
//			try {
//				Thread.sleep(50);//  50  
//			} catch (Exception e) {
//				// TODO: handle exception
//			}
			
			
			//   ,  juc lock
			//lock synchronized    ,    jdk  ,lock    
			lock.lock();//    ,                , 4        
			try {
				if(count > 0) {//    
					System.out.println(Thread.currentThread().getName()+
							"   "+
							count+
							"    ");
					count--;
				}
			} catch (Exception e) {
				// TODO: handle exception
			} finally {
				lock.unlock();//  ,          ,    、    ,     
			}
			try {
				Thread.sleep(50);//  50  
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
		
	}
	
	
//	//   ,      synchronized
//	public synchronized void sale(){ //            
//		if(count > 0) {//    
//			System.out.println(Thread.currentThread().getName()+
//					"   "+
//					count+
//					"    ");
//			count--;
//		}
//	}
	
	
	/****        ,  :jvm                           ****/
}