上一篇文章我们讲解了使用synchronized关键字来解决线程的同步问题,那么本篇文章我们使用Lock锁来解决同步问题
在Java5之后,出了一个新的同步方式就是Lock锁来解决线程安全问题,话不多说直接上代码!
代码
/**
* @author LFDMW
* @date 2020-11-14 23:03
*/
public class MyLock implements Runnable {
/**
* 首先我们需要创建一个ReentrantLock锁对象这里可以用Lock接收或使用ReentrantLock
* ReentrantLock是实现了Lock接口
*/
ReentrantLock lock = new ReentrantLock();
private int num = 0;
@Override
public void run() {
while (true) {
// 在需要加锁的时候调用lock方法,lock方法可以理解为上锁,
// 这里注意lock方法要与try配合使用,try中是需要被加锁也就是需要处理线程安全的代码
lock.lock();
try {
if (num < 100) {
synTest();
} else {
break;
}
} finally {
// 我们加锁之后需要手动解锁,在finally中使用unlock方法即可解锁
lock.unlock();
}
}
}
private void synTest() {
num++;
System.out.println(Thread.currentThread().getName() + "" + num);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyLockTest {
public static void main(String[] args) {
MyLock myLock = new MyLock();
Thread t1 = new Thread(myLock);
Thread t2 = new Thread(myLock);
Thread t3 = new Thread(myLock);
t1.setName("线程1-");
t1.start();
t2.setName("线程2-");
t2.start();
t3.setName("线程3-");
t3.start();
}
}
总结
方法解读:
lock方法: 对当前线程加锁
unlock方法: 释放当前线程的锁
其实使用方法和synchronized关键字区别不大,只不过Lock锁是显式解锁,所以我们需要手动去解锁,别忘记使用unlock哦!
Lock锁也是只有代码块的,没有直接在方法上声明的
推荐使用Lock锁来解决线程安全问题,因为性能更好,并且具有更好的扩展性,包括synchronized里使用wait,notify等方法,lock锁中也有对应的可以实现通知和等待的方法,我们后面的文章中会讲解!