线程lock(锁) 15
ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,
比较常用的是ReentrantLock,可以显示式加锁。
-
synchronized与Lock的对比:1. Lock是显示锁 ( 手动开启和关闭锁,别忘记关闭锁 ) synchronized是
隐式锁,出了作用域自动释放。
2. Lock只有代码块锁,synchronized有代码块锁和方法锁。
3. 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好,
4.优先使用顺序:Lock> 同步代码块(已经进入方法体,分配了相应资源
)> 同步方法(在方法体之外)
class A
{
private ReentrantLock = new ReenTrantLock();
public void m()
{
lock.lock();//加锁
try{
//保证线程安代码。
}
finally{
lock.unlock();//解锁
//如果同步代码有异常,要将unlock写入finally语句块
}
}
}
package Runnable1;
import java.util.concurrent.locks.ReentrantLock;
//测试lock锁
//抢票
public class TestLock
{
public static void main(String[] args) {
TestLock2 testLock2=new TestLock2();
new Thread(testLock2,"我").start();
new Thread(testLock2,"你").start();
new Thread(testLock2,"他").start();
}
}
class TestLock2 implements Runnable
{
int ticketNums=10;
//定义lock锁
private final ReentrantLock lock=new ReentrantLock();