Java多线程之synchronized和lock
程序员文章站
2024-01-09 17:54:10
...
一、synchronized同步关键字
Java 中的同步块用 synchronized 标记。同步块在 Java 中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出
-
同步方法:
同步方法,锁当前对象,即this
class BuyTickets implements Runnable {
private int Tickets = 10;
@SneakyThrows
public synchronized void run() {//同步方法,锁当前对象,即this
while (true) {
if (Tickets > 0) {
System.out.println(Tickets--);
Thread.sleep(1000);
} else {
System.out.println("售罄");
break;
}
}
}
}
-
同步块:‘
同步块,可以锁需要增删改的对象
class BuyTickets implements Runnable {
private int Tickets = 10;
@SneakyThrows
public void run() {
synchronized (this){
//同步块,可以锁需要增删改的对象,因为此例子中就是改当前对象,所以用this
while (true) {
if (Tickets > 0) {
System.out.println(Tickets--);
Thread.sleep(1000);
} else {
System.out.println("售罄");
break;
}
}
}
}
}
二、Lock接口实现同步锁
常用ReentrantLock(可重入锁)来使用,其实现了Lock接口
class BuyTickets implements Runnable{
private int Tickets=10;
private final ReentrantLock lock= new ReentrantLock();
@SneakyThrows
public void run() {
try {
lock.lock();//加锁
while (true){
if (Tickets>0){
System.out.println(Tickets--);
Thread.sleep(1000);
}else {
System.out.println("售罄");
break;
}
}
} finally {
lock.unlock();//解锁
}
}
}
三、Synchronized和Lock对比
- Synchronized是Java内置的关键字;Lock是Java的一个类
- Synchronized无法获取锁得状态;Lock可以判断是否获取了锁
- Synchronized会自动释放锁;Lock必须要手动释放锁,不释放可能死锁
- Synchronized线程1(获取锁),线程2(等待);Lock锁不一定会等待下去(trylock方法)
- Synchronized可重入锁,不可以中断,非公平;Lock可重入锁,可以判断锁,可以公平与非公平
- Synchronized适合锁少量代码块同步问题;Lock可以适用于大量代码块同步问题