解決資源共享問題的方法通常是在指定時間段內只容許一個線程訪問共享資源,這時就須要給共享資源上一道鎖,好比售票員售票,當一個售票員在售第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(); } } } //程序運行結果同上