1.并發(fā)
- 并發(fā):同一個對象被多個線程同時操作,當多個線程訪問同一個線程對象
2.線程同步
- 處理多線程問題時,多個線程訪問同一個對象,并且有些縣城想要修改這個對象事,需要線程同步。
- 線程同步是一種等待機制,多個需要同時訪問此對象的線程進入對象的線程池形成隊列,接著有序、依次執(zhí)行。
- 線程同步安全形成條件:隊列+鎖
- 由于同一進程的多個線程共享同一塊存儲空間,帶來方便的同時也會帶來訪問沖突問題,為了保證數(shù)據(jù)在方法中被訪問時的正確性,在訪問時加入鎖機制,synchronized,當對象獲得排它鎖時,獨占資源,其他線程必須等待,使用后釋放鎖即可。
3.排它鎖存在問題
- 其他需要此鎖的線程被掛起
- 多線程競爭下,加鎖,釋放鎖會導致比較多的上下文切換和調(diào)度延時,引起性能問題
- 優(yōu)先級高的線程等待優(yōu)先級低的線程釋放鎖,會導致優(yōu)先級導致,引起性能問題。
3.并發(fā)問題代碼示例
買票
public class TestThread extends Thread{ private int ticketnum = 10; boolean flag = true; @Override public void run() { while(flag) { try { buy(); } catch (InterruptedException e) { e.printStackTrace(); } } } private void buy() throws InterruptedException { if(ticketnum>0) System.out.println(Thread.currentThread().getName() + "買到了倒數(shù)第" + ticketnum-- + "張票"); else flag = false; Thread.sleep(1000); } public static void main(String[] args) { TestThread testThread = new TestThread(); new Thread(testThread,"個人").start(); new Thread(testThread,"代理").start(); new Thread(testThread,"其他").start(); } }