Java 執行緒同步、死鎖
執行緒同步(保證執行緒安全:沒有鎖的執行緒只能等)獲取鎖 釋放鎖 執行慢
public class ThreadDemo { //買門票例子
public static void main(String[] args) {
MyTicket mt= new MyTicket(); //建立任務 /MyTicket2
Thread t1 = new Thread(mt); //建立執行緒 執行同一個任務
Thread t2 = new Thread(mt); //查詢安全 修改不安全
t1.start();
t2.start();
}
}
public class MyTicket implements Runnable{
private int ticket=100;
private Lock lock =new ReentrantLock();//建立Look介面實現物件
private Object obj=new Object();//鎖物件 全域性變數 執行緒共用一把鎖
public void run() {
while(true){//執行緒帶著鎖物件(obj)走,走完把鎖放回
synchronized(obj){//同步程式碼塊 //lock.lock();//獲取鎖
if(ticket>0){ //其他執行緒拿不到鎖 進不來
Thread.sleep(50); //點 try...catch
System.out.print(Thread.currentThread().getName())
System.out.println(+"剩"+ticket--);//先列印 後減一
}
} //同步程式碼塊 //lock.unlock();//釋放鎖
}
}
}
//同步方法鎖 任務類
public class MyTicket2 implements Runnable{
private int ticket=100; //static 靜態變數
public synchronized void sile(){//同步方法鎖物件
if(ticket>0){ //static 靜態同步方法 鎖物件(類名.class)本類物件
Thread.sleep(50); //當前類的位元組碼物件
System.out.println(Thread.currentThread().getName())
System.out.println(+"剩"+ticket--+"張");//先列印 後減一
}
}
public void run() {
while(true){ sile(); }
}
}
// 高併發(多人同時訪問)解決:加伺服器 專案拆分
死鎖:(多執行緒之間的同步巢狀時,兩個執行緒互相等待) 避免
public class MyLock {
public static final Object lockA = new Object();
public static final Object lockB = new Object();
}
public class DeadLock implements Runnable {
private int x=0;
public void run() {
while(true){
if (x%2 ==0) {
synchronized (MyLock.lockA) {
System.out.println("if-LockA");
synchronized (MyLock.lockB) {
System.out.println("if-LockB");
}
}
} else{
synchronized (MyLock.lockB) {
System.out.println("else-LockB");
synchronized (MyLock.lockA) {
System.out.println("else-LockA");
}
}
}
x++;
}
}
}
public class Demo01 {
public static void main(String[] args) {
DeadLock dl=new DeadLock();
Thread t0=new Thread(dl);
Thread t1=new Thread(dl);
t0.start();
t1.start();
}
}