线程同步lock锁
线程同步的第三种方法
Lock锁:对需要上锁的地方上锁
注意:
如果同步代码有异常,要将unLock()放到finally中
java.util.concurrent.locks中的Lock是一个接口,它的关键类是一个java类,而不是作为语言的特性,也就是关键字去实现
步骤
- 创建Lock对象
- 调用lock()方法上锁
- 调用unlock()方法上锁
Lock和synchronized的区别
- Lock是显示锁,需要手动开始和关闭锁。synchronized是隐式锁
- Lock只有代码块锁,synchronized有代码块锁也有方法锁
- 使用Lock锁,JVM使用较少的时间去调度线程,性能较好,并且可以提供更多的子类
- Lock方法会对Lock实例对象进行加锁,所有对这个对象调用Lock()方法的线程都会被阻塞,知道这个Lock对象的unlock()方法被调用
示例代码
我们先看下错误的代码
package account;
public class CountRunnable implements Runnable{
private int count = 0; //默认值
@Override
public void run() {
for (int i=0;i<10;i++){
count++;
try {
Thread.sleep(300); //休眠300毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
//Thread.currentThread().getName() 获取到多线程的名称
System.out