1. 程式人生 > >Java 執行緒同步、死鎖

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(){//同步方法鎖物件

(this) :StringBuffer

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();

}

}