線程的生命週期:
新建---就緒--阻塞--運行--死亡
新建--就緒(調用start方法)
運行---阻塞(sleep,join,wait)
死亡(執行run方法結束,拋出異常)
阻塞---就緒 sleep時間到,notify,notifyAll
1.線程存在安全問題的原因?
由於一個線程在操作共享數據時未執行完的情況下,另外的線程參與進來,導致共享數據存在安全問題。
2.如何解決線程安全問題
必須讓一個線程操作共享數據完畢以後,其它線程纔有機會纔有機會參與共享數據的操作
3.java如何實現線程的安全:線程的同步機制
1.同步代碼塊2.同步方法
synchronized(對象(同步監視器)){
//需要被同步的代碼塊,操作共享數據的代碼
1.共享數據:多個線程共同操作的數據(變量)
2.同步監視器:由任何類的對象來充當,哪個線程獲取此監視器,誰就執行大括號裏的代碼,俗稱鎖。
}
只有實現的方式同步監視器纔可以使this,因爲實現方式多個線程同時執行一個任務,只創建了一個對象
如果是繼承的方式對象不可以是this,該對象只可以是靜態的類對像 static Object obj=new Object();因爲鎖對象必須是唯一的,繼承方式創建了多個對象,如果不加
static每個對象都有一個obj,鎖就會不唯一,線程依然會有安全問題。
public class ThreadRun implements Runnable {
int ticket=100;
public static void main(String[] args) {
ThreadRun tr=new ThreadRun();
Thread th=new Thread(tr);
Thread th1=new Thread(tr);
th.setName("窗口1");
th.start();
th1.setName("窗口2");
th1.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(this){//可以是this 或者創建任意類的對象,Object obj=new Object();synchronized(obj){}
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"ticket="+ticket--);
}else{
break;
}
}
}
}
}