【Thread】スレッド同時解決synchronized


(二)ConcurrentThread
1.実際には、10の窓口でチケットを販売し、同時に安全性の問題があり、1枚のチケットを2人に売ることはできません
2.電子商取引では、10個の携帯電話が50個売れ、50人に奪われた
3.スレッド同期(ロック)
列車のトイレ、トイレは資源を共有して、トイレに行く人は同時のスレッドで、トイレは100回しか嘘をつくことができません
4.スレッド同時セキュリティの問題に対して、同期ロックを使用する必要があります.つまり、共有リソースは同時に1つのスレッドしかアクセスできません.
5.共有リソース同期ロックコードブロック
synchronized(ロックオブジェクト){
共有リソースコードの操作
}
6.同期コードの追加先
(1)コードが複数のスレッドによってアクセスされる
(2)コードに共有されたデータがある
(3)共有データが複数の文で操作される
コード:SaleTicket_synchronized
public class SaleTicket_synchronized extends Thread{
	private static int ticket=100;
	private String windowname;

	// 3.         
	private static Object obj=new Object();
	
	// 1.        ,         
	public SaleTicket_synchronized(String windowname) {
		super(windowname);
		this.windowname=windowname;
	}

	// 2.  run  
	@Override
	public void run() {
		while(true) {
			// 4.       
			synchronized (obj) {
				if(ticket>0) {
//					try {
//						Thread.sleep(10);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
					System.out.println(this.getName()+" :      "+ticket+"   ");
					ticket=ticket-1;
				}else {
					System.out.println(this.getName()+" :    ");
					break;
				}
			}
			
		}
	}
}

コード:Main_synchronized
public class Main_synchronized {
	/**
	 *   
	 * 4   , 100  
	 * */
	public static void main(String[] args) {
		// 5.  SaleTicket  
		SaleTicket_synchronized st1=new SaleTicket_synchronized("  1");
		st1.start();
		
		SaleTicket_synchronized st2=new SaleTicket_synchronized("  2");
		st2.start();
		
		SaleTicket_synchronized st3=new SaleTicket_synchronized("  3");
		st3.start();
		
		SaleTicket_synchronized st4=new SaleTicket_synchronized("  4");
		st4.start();
	}
}