//争搶的鎖資源
public static Lock lock =new ReentrantLock();
//控制線程挂起和執行
public static Condition cond =lock.newCondition();
//保證線程優先執行
public volatile static boolean flag =true;
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
lock.lock();
flag=false;
for(int i=0;i<5;i++){
System.out.println("a");
cond.signalAll();//喚醒挂起的線程
try {
cond.await();//自身挂起
} catch (InterruptedException e) {
e.printStackTrace();
}
}
cond.signalAll();
lock.unlock();
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
lock.lock();
if(flag){
try {
cond.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<5;i++){
System.out.println("b");
cond.signalAll();
try {
cond.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.unlock();
}
}).start();
}
和synchronized思路一樣,都是控制線程的挂起和喚醒,還有注意對哪個線程優先的控制,後面想想volatile關鍵字,其實沒有起到作用,加上鎖的區域就保證了可見性,不需要用volatile了。