JUC第一個筆記
阿新 • • 發佈:2021-01-23
JUC
一.執行緒和程序
程序:
一個程序包含多個執行緒,至少包含一個執行緒!
java預設有倆個執行緒,一個main主方法,還有一個GC垃圾回收。
執行緒:
一個程序就像一隻火車,一個執行緒就像一隻車廂,比如說一隻車廂著火了,會影響其他車廂,但是不會影響另一輛火車(程序之間沒有影響),同一個程序下之間資料容易完成資料共享,比如同一輛火車不同車廂之間。
併發:
cpu只有一核,快速切換,實現多執行緒,交替執行。
併發程式設計的本質:充分利用cpu資源
並行
cpu多核,不用快速切換,多個任務同時執行,一起行走。
執行緒有幾個狀態:
public enum State {
//新建
NEW,
//執行
RUNNABLE,
//阻塞
BLOCKED,
//等待(一直死等)
WAITING,
//超時等待(有等待時間,過期不候)
TIMED_WAITING,
//終止
TERMINATED;
}
wait和sleep的區別:
1.來自不同的類:
wait->object
sleep->Thread
2.鎖的釋放:
wait可以釋放鎖!
sleep抱著鎖頭睡覺,不會釋放!
3.適用範圍:
wait必須在同步程式碼塊中!
sleep可以在任何地方!
synchronized 模擬搶票!
public class Test {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(
new Runnable(){
@Override
public void run() {
for (int i=0;i<50;i++){
ticket.sale();
}
}
}
).start();
new Thread(
new Runnable(){
@Override
public void run() {
for (int i=0;i<50;i++){
ticket.sale();
}
}
}
).start();
new Thread(
new Runnable(){
@Override
public void run() {
for (int i=0;i<50;i++){
ticket.sale();
}
}
}
).start();
}
}
class Ticket{
private int number = 40;
public synchronized void sale() {
if (number > 0) {
System.out.println("還剩" + (--number) + "張票!");
}
}
}
Lock鎖:
ReentrantLock:可重入鎖
三個步驟:
1.Lock lock = new ReentrantLock();
2.方法前加鎖lock.lock();
3.try cache finally{
lock.unlock()#解鎖
}
public class Test2 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}
}).start();
}
}
class Ticket2{
int number =40;
//可重用鎖
Lock lock = new ReentrantLock();
public void sale(){
lock.lock();
try {
if (number>0) {
System.out.println("還剩" + (--number) + "張票");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}