显示的定义锁,进行上锁和解锁。
ReentrantLock初体验:
package diaodu;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author jitwxs
* @date 2021年05月09日 19:52
*/
public class Lock { //测试Lock
public static void main(String[] args) {
Lock1 lock1 = new Lock1();
new Thread(lock1).start();
new Thread(lock1).start();
new Thread(lock1).start();
}
}
class Lock1 implements Runnable{
int ticketNumbers = 10;
//定义Lock锁
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while(true) {
try {
lock.lock(); //加锁
if(ticketNumbers>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(ticketNumbers--);
}else{
break;
}
}finally {
//解锁
lock.unlock();
}
}
}
}
synchronized 和 Lock对比:
- Lock是显示锁,手动开启锁,关闭锁,synchronized是隐式锁,出了作用域自动释放。
- Lock只有代码快锁,synchronized有代码快锁和方法锁。
- 使用Lock锁,JVM将花费较少时间来调度线程,
性能更好
。并且既有很好的扩展性。 - 使用的优先顺序:Lock > 同步代码块 > 同步方法