Lock锁
概念
- 线程同步机制——通过显式定义同步锁对对象来实现同步
- ReentrantLock实现了Lock,拥有与synchronized相同的并发性和内存语义。
synchronized的缺陷
- 如果获取锁的线程需要等待或调用了sleep()方法被阻塞了,synchronized不会释放锁,于是其他线程只能等待
- 有时候的行为并不会造成冲突,比如读和读操作,但synchronized来实现的同步却会拒绝这些操作。
- 另外Lock可以知道线程有没有得到锁,synchronized不能
Lock和synchronized的区别
- Lock是一个接口,synchronized是关键字
- synchronized会自动释放锁,Lock需要手动释放
- Lock可以让等待的线程响应中断,synchronized不会,所以线程会一直等待下去
- Lock可以知道线程有没有拿到锁
- Lock只能锁住块范围,synchronized可以锁住块,方法,类。
测试代码
import java.util.concurrent.locks.ReentrantLock;
/**
* 测试Lock锁
*/
public class TestLock implements Runnable{
int ticket = 10;
final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (true){
try {
lock.lock();
if(ticket > 0) {
try {
System.out.println(Thread.currentThread().getName() + "-->" + ticket--);
Thread.sleep(100);
}catch (Exception e){
}
}
else {
break;
}
}finally {
lock.unlock();
}
}
}
public static void main(String[] args) {
TestLock t1 = new TestLock();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
}
}