之前本来在写完多线程之后就写lock体系的,可以作以对比,但之后又写了其他知识的博客,一直拖到今天才写lock相关的知识,大家在看lock锁的时候,可以对比着看内建锁,对比对比lock锁和内建锁的优缺点。
这是我那篇关于内建锁的博客链接:https://blog.csdn.net/huaijiu123/article/details/85242821
lock在Java的util包下
lock体系下的线程的阻塞与唤醒,不再用内建锁和monitor机制了,而是用lock和unlock。
1. lock锁和内建锁最大的区别就是:内建锁是隐式的加减锁,而lock是显示的加减锁
public class Test {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
try{
lock.lock();
//以下代码被锁住,同一时刻只能一个线程可以运行
}finally {
lock.unlock();
}
}
}
解锁操作必须放在finally中,保证无论是否发生异常,都会释放锁。
下来我们看一个例子:还是卖票,这次是用lock加锁
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class MyThread implements Runnable{
private int ticket = 500;
private Lock lock = new ReentrantLock();
@Override
public void run() {
for(int i = 0; i < 500; i++){
try{
lock.lock();
if(ticket > 0){
System.out.println(Thread.currentThread().getName()+"还剩"+ticket--+"票");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}finally {
lock.unlock();
}
}
}
}
public class Test {
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread th1 = new Thread(mt,"A");
Thread th2 = new Thread(mt,"B");
Thread th3 = new Thread(mt,"C");
th1.start();
th2.start();
th3.start();
}
}
内建锁与lock锁的区别如果将lock换成synchronized的话,run()方法,同一时刻是可以多个线程同时进去的,这就是同一时刻多个线程竞争同一把锁,是重量级锁,其他线程进入阻塞状态,而lock锁,会使其他线程进入自旋状态。
lock锁除了用于内建锁的所有特性外,还拥有内建锁不具备的特性