java_Lock
例子代码
package com.heima.senior;
import java.util.concurrent.locks.ReentrantLock;
public class Lock {
public static void main(String[] args) {
TestLock lock = new TestLock();
new Thread(lock).start();
new Thread(lock).start();
new Thread(lock).start();
}
}
class TestLock implements Runnable{
int ticketNumber = 10;
//定义lock锁
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
try{
while(true){
if (ticketNumber>0){
try {
//加锁
lock.lock();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(ticketNumber--);
}else{
break;
}
}
}finally {
//解锁
lock.unlock();
}
}
}
模板:
class A{
//定义lock锁
private final ReentrantLock lock = new ReentrantLock();
@Override
public void m() {
lock.lock();
try {
//保证线程安全的代码
}
finally {
//解锁
lock.unlock();
//如果同步代码块有异常,要把unlock写入finally语句块
}
}
与synchronized对比
(1)Lock是显式锁(需要手动开启、关闭),synchronized是隐式锁,出了作用域就会自动关闭。
(2)Lock只有代码块锁,synchronized有代码块和方法块锁
(3)使用Lock锁·,JVM将花费更少的时间来调度线程,新能更好,并且具有更好的扩展性(提供更好的子类)
(4)优先使用顺序:Lock > 同步代码块(已经进入方法体,分配了相应资源) > 同步方法(在方法体之外)