1.lock
锁提供对共享资源的独占访问,同一时刻,只能用一个线程获得锁
import java.util.concurrent.locks.ReentrantLock;
public class D23 {
public static void main(String[] args) {
T t = new T();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class T implements Runnable{
int num = 10;
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while(true){
lock.lock();
try {
if(num<=0){
return;
}else {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + " get ticket " + num--);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
}
}
}
格式为:
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
//并发代码
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
lock.unlock(); //无论如何,最后一定要unlock
}
2.ReentrantLock 可重入的互斥锁
3.lock 与 synchronized 对比
lock | synchronized |
显式锁,手动开启和释放 | 隐式锁,出了作用域自动释放 |
接口,有实现类 | 关键字 |
只有代码块锁 | 有代码块锁和方法锁 |
更灵活,有可扩展的子类 | |
所需调度时间更少,性能更好 |