賣演唱會票例子
保證:多個執行緒訪問共享的資料(資料只有乙份)
public static void main(string args)
//介面實現執行緒的方式
class ticketrunnable implements runnable catch (interruptedexception e)
//賣system.out.println(thread.currentthread().getname()+"*****"+ticket);
//賣一張 少一張
ticket--;
}else
}//讓出cpu的執行資源(隨機讓出)
thread.yield();
} }}
同步**塊規則:
當執行緒進入同步**塊的時候
先看一下有沒有鎖
如果有鎖 就進入同步**塊中執行**
進去的同時會獲取這把鎖
當**執行完畢 出同步**塊時 將這把鎖釋放(還回去)
如果沒鎖 執行緒在同步**塊前等待(等著有鎖才能進)
同步**塊(同步鎖)
鎖:任意物件(只有一把鎖 使用的是同一把鎖)
synchronized(鎖)
同步鎖好處:資料安全
壞處:效率會降低(獲取鎖和釋放鎖 會耗費資源)
同步方法(作用和同步**塊相同)
也是用synchronized關鍵字
該關鍵字宣告在方法上
同一時間 只能有乙個執行緒進入到同步方法中執行**
同步方法中 也是寫操作共享資料的**
處理方式和同步**塊一樣
public synchronized void sellticket()
jdk1.5 lock 介面
使用實現類 reentrantlock
lock();獲取鎖
unlock();釋放鎖(保證鎖一定會被釋放)
使用前提:和同步**塊一樣 要保證用的是同一把鎖
使用格式:
tryfinally
while (true) finally
}
執行緒死鎖
前提:必須要有同步鎖的巢狀
2.鎖物件要唯一(使用的是同一把鎖)
兩把鎖都要保證唯一
synchronized()
}
public static void main(string args)
//建立a鎖
class locka
//定義乙個常量
public static final locka lock_a=new locka();
}//建立b鎖
class lockb
//定義乙個常量
public static final lockb lock_b=new lockb();
}class dielockrunnable implements runnable
}}else }}
//修改標記
isflag=!isflag;
} }}
執行緒如何停止?
interrupt()方法 中斷執行緒
1.呼叫interrupt方法是 執行緒中有wait()/sleep()等方法 這時會丟擲乙個異常
interruptexception異常 並且清除中斷狀態
2.呼叫interrupt方法時 執行緒中沒有上述方法
這時會設定(改變)中斷狀態的值(true---false)
public static void main(string args) catch (interruptedexception e)
//中斷執行緒
t1.interrupt();
//標記中斷執行緒
runnable.isflag=true;
system.out.println("中斷執行緒");
try catch (interruptedexception e)
system.out.println("主線程結束");
}class interruptrunnable implements runnable catch (interruptedexception e)
//休眠一秒(迴圈卡1秒)
//long time = system.currenttimemillis();
//while (system.currenttimemillis()-time<1000)
system.out.println(thread.currentthread().getname()+"...run");
} }}
呼叫interrupt方法時
執行緒中有wait()方法
wait()方法 執行緒等待並且如果沒有被喚醒 就一直等待下去
是object類中的方法
直接使用wait()方法會出現異常
注意:wait()方法必須使用鎖物件去呼叫
public static void main(string args)
system.out.println(i);
} system.out.println("主線程結束");
}class waitrunnable implements runnable catch (interruptedexception e)
system.out.println(thread.currentthread().getname()+"...run");
} }}
從子執行緒中更改中斷執行緒的標記
讓主線程能夠接到這個標記改變
public static void main(string args)
system.out.println("主線程結束");
}class volrunnable implements runnable catch (interruptedexception e)
if (num>5)
system.out.println(thread.currentthread().getname()+"...run");
} }}
java學習筆記之多執行緒(2)之執行緒安全
1 同步 塊 synchronized obj 鎖的必須是各執行緒共享的物件 2 同步方法 synchronized 方法,對自己加鎖 synchronized this 3 同步鎖 只介紹可重入鎖 final reentrantlock lock new reentrantlock 加鎖 呼叫lo...
Java學習之執行緒總結
一 建立執行緒 重點 1 繼承thread 2 實現runnable介面 3 實現callable 了解 二 執行緒的狀態 1 新生 start 就緒 執行 阻塞 終止 2.終止執行緒 重點 3.阻塞 join yield sleep 三 執行緒的資訊 1.thread.currentthread ...
學習日記 java之執行緒
建立執行緒的兩種方法 1 繼承thread類 2 實現runnable介面 解決了單繼承的問題 獲取執行緒的名稱 1 原來執行緒是有預設的名稱的 thread 編號,編號從零開始 2 用getname 可以獲取執行緒名稱。static thread currentthread 獲取當前執行緒物件。直...