ReentrantLock 重入锁 可以实现 sync ,比sync灵活,需要手动释放锁
new ReentrantLock();//随机分配锁
new ReentrantLock(true);//声明公平锁 等待时间越长,得到锁的优先级越高
lock.lock();//申请
lock.unlock();
bool lockFlag = lock.tryLock();//尝试去拿锁,返回lock,如果为true,说明拿到锁,需要解锁
bool lockFlag = lock.tryLock(5, TimeUnit.MINUTES);//尝试去拿锁,等待5分钟
lock.lockInterruptibly(); 可被打断的等待锁,主线程调用此线程的 interrupt 方法。
/**
* 锁的使用很简单
* 1:申请锁 / 锁定代码
* 2:释放锁
可以代替synchronize
*/
public class ReentrantLockTest {
Lock lock = new ReentrantLock();//重入锁
void m1(){
try {
System.out.println("申请锁 111");
lock.lock();//相当于 synchronized(this)
System.out.println("得到锁 111");
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("释放锁 111");
lock.unlock();
}
}
void m2(){
try {
System.out.println("申请锁 222");
lock.lock();//相当于 synchronized(this)
System.out.println("得到锁 222");
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("释放锁 222");
lock.unlock();
}
}
public static void main(String[] args) {
ReentrantLockTest test = new ReentrantLockTest();
new Thread(test::m1).start();
new Thread(test::m2).start();
}
}
运行结果:
申请锁 111
得到锁 111
申请锁 222
释放锁 111
得到锁 222
释放锁 222