java thirteen線程同步機制

解決資源共享問題的方法通常是在指定時間段內只容許一個線程訪問共享資源,這時就須要給共享資源上一道鎖,好比售票員售票,當一個售票員在售第X張票時,就把資源X鎖住了,直到售票結束。java

線程同步的方法:ide

一、同步塊spa

synchronized(object){
} //object:同步塊鎖定的對象,不容許同一時間共享的資源
 package Thirteen;

public class ThreadSafeTest extends Thread {
 /*Integer i=0;  

i是一個對象  
 
int i=3;  

i是一個基礎變量  */

 private static Integer num = 1;
 public ThreadSafeTest(String name){
  //void java.lang.Thread.setName(String name)
  setName(name);
 }
 
 @Override
 public void run(){
  
 
  synchronized(num){
   if(num>0){
   System.out.println(getName()+":檢測票數大於0,能夠出票");
   System.out.println(getName()+":\t正在收款(大約5秒)……");
   
   try{
    Thread.sleep(5000);
    System.out.println(getName()+":\t售票完成");
    num--;
    System.out.println("系統當前票數:"+num);
    if(num<0)
     System.out.println("警告:無票");
   }catch(InterruptedException e){
    e.printStackTrace();
   }
  }else{
   System.out.println("無票,中止銷售");
  }
 }
 } 
 public static void main(String[] args){
  try{
   new ThreadSafeTest("售票員A").start();
   Thread.sleep(2000);
   new ThreadSafeTest("售票員B").start();
  }catch(InterruptedException e){
   e.printStackTrace();
  }
 }
}

二、同步方法線程

synchronized void syncMethod(){
}
package Thirteen;

public class ThreadSafeTest extends Thread {
 /*Integer i=0;  
i是一個對象  
 
int i=3;  

i是一個基礎變量  */

 private static Integer num = 1;
 public ThreadSafeTest(String name){
  //void java.lang.Thread.setName(String name)
  setName(name);
 }
 
 @Override
 public void run(){
  sell(getName());
 }
 
  //synchronized(num)
 private static synchronized void sell(String name) {
   if(num>0){
   System.out.println(name+":檢測票數大於0,能夠出票");
   System.out.println(name+":\t正在收款(大約5秒)……");
   
   try{
    Thread.sleep(5000);
    System.out.println(name+":\t售票完成");
    num--;
    System.out.println("系統當前票數:"+num);
    if(num<0)
     System.out.println("警告:無票");
   }catch(InterruptedException e){
    e.printStackTrace();
   }
  }else{
   System.out.println("無票,中止銷售");
  }
 }
 
 public static void main(String[] args){
  try{
   new ThreadSafeTest("售票員A").start();
   Thread.sleep(2000);
   new ThreadSafeTest("售票員B").start();
  }catch(InterruptedException e){
   e.printStackTrace();
  }
 }
} //程序運行結果同上
相關文章
相關標籤/搜索