互斥锁
JDK1.5的新特性:互斥锁
所谓互斥锁,指的是一次最多只能有一个线程持有的锁。在jdk1.5之前,我们通常使用synchronized机制控制多个线程对共享资源的访问。而现在,Lock提供了比synchronized机制更广泛的锁定操作。
线程同步:使用ReentrantLock类的lock()和unlock()方法进行同步通信
通信:
- 使用ReentrantLock类的newCondition()方法可以获取Condition对象
- 需要等待的时候使用Condition的await()方法, 唤醒的时候用signal()方法
- 不同的线程使用不同的Condition, 这样就能区分唤醒的时候找哪个线程了
Lock--已知实现-->ReentrantLock
lock()获取锁
unLock()释放锁
Lock ---> ReentrantLock--->newCondition()获取Condition
await()//使线程处于等待状态
signal()//唤醒一个处于等待状态的线程
signalAll()//唤醒所有处于等待状态的线程
package org.lanqiao.thread.demo;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/*
* 要求:在线程执行输出的时候,太原师范和蓝桥软件轮流输出
* 多个线程(>2)的时候,能够让多个线程轮询执行
*
*
*/
public class ThreadDemo2 {
static int flag = 1;
public static void main(String[] args) {
ReentrantLock rl = new ReentrantLock();
Condition c1 = rl.newCondition();
Condition c2 = rl.newCondition();
Condition c3 = rl.newCondition();
Print p = new Print();
new Thread() {
public void run() {
while(true) {
rl.lock();//获取锁
if(flag != 1) {
try {
c1.await();//等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
p.print1();
flag = 2;
c2.signal();//唤醒
rl.unlock();//释放锁
}
}
}.start();
new Thread() {
public void run() {
while(true) {
rl.lock();
if(flag != 2) {
try {
c2.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
p.print2();
flag = 3;
c3.signal();
rl.unlock();
}
}
}.start();
new Thread() {
public void run() {
while(true) {
rl.lock();
if(flag != 3) {
try {
c3.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
p.print3();
flag = 1;
c1.signal();
rl.unlock();
}
}
}.start();
}
}
class Print{
public void print1() {
System.out.print("太");
System.out.print("原");
System.out.print("师");
System.out.print("范");
System.out.println();
}
public void print2() {
System.out.print("蓝");
System.out.print("桥");
System.out.print("软");
System.out.print("件");
System.out.println();
}
public void print3() {
System.out.print("山");
System.out.print("西");
System.out.print("晋");
System.out.print("中");
System.out.println();
}
}