和 synchronized 类似,synchronized基于JVM,依赖JVM,线程安全
可以指定公平和非公平锁
默认创建非公平锁
可以中断一个线程,lock.lockInterruptibly()
package com.jysemel.java.locks;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockDemo {
* 默认创建非公平锁
*/
private static final ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
lock.lock();
System.out.println(Thread.currentThread().getName() + "获取成功");
try {
System.out.println(Thread.currentThread().getName() + "执行业务");
Thread.sleep(TimeUnit.SECONDS.toMillis(4));
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
System.out.println(Thread.currentThread().getName() + "获取成功");
}
}).start();
}
}
}
package com.jysemel.java.locks;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockConditionDemo {
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
public void await() {
if (lock.tryLock()) {
try {
System.out.println("await开始等待");
condition.await();
System.out.println("await结束等待");
} catch (InterruptedException e) {
System.out.println("--------------");
} finally {
lock.unlock();
}
}
}
public void signal() {
if ( lock.tryLock()) {
try {
System.out.println("signal开始通知");
try {
Thread.sleep(TimeUnit.SECONDS.toMillis(3));
} catch (InterruptedException e) {
System.out.println("---------");
}
condition.signal();
System.out.println("signal 唤醒通知完毕");
} finally {
lock.unlock();
}
}
}
public static void main(String[] args) throws InterruptedException {
ReentrantLockConditionDemo counter= new ReentrantLockConditionDemo();
new Thread(counter::await).start();
Thread.sleep(3000);
new Thread(counter::signal).start();
}
}
可通过lockInterruptibly 中断
支持超时获取
支持 Condition
代码