上节课学了怎么去直接用Lock接口来加锁,这节课学习了如果创建自己的加锁类,做一总结记录。
package com.cljtest.demo.mylock;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class Mylock implements Lock {
private boolean isHoldLock = false;
private Thread holdLockThread = null;
private int reentryCount = 0;
/**
* 同一时刻,能有且仅能有一个线程获取到锁,其他线程,只能等待
* 线程释放锁之后才能获取到锁
*/
@Override
public synchronized void lock() {
/**
* 已经持有锁,但是当前线程不等于持有锁线程要进行等待
*/
if(isHoldLock && Thread.currentThread() != holdLockThread){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
holdLockThread = Thread.currentThread();
isHoldLock = true;
reentryCount++;
}
@Override
public synchronized void unlock() {
/**
* 判断当前线程是否是持有锁的线程,如果是,重入次数减1,不是就不做处理
*/
if(Thread.currentThread() == holdLockThread){
reentryCount--;
if(reentryCount == 0){
notify();
isHoldLock = false;
}
}
}
@Override
public Condition newCondition() {
return null;
}
@Override
public void lockInterruptibly() throws InterruptedException {
}
@Override
public boolean tryLock() {
return false;
}
@Override
public boolean tryLock(long l, TimeUnit timeUnit) throws InterruptedException {
return false;
}
}
创建自己的一个类,实现Lock接口的lock()和unlock()方法,然后进行操作,要注意的是要在加锁和解锁的方法上加synchronized关键字,否则会报如下图的异常,因为拿到的锁无法确定是不是一个,要让他同步。
可以写个类,加两个简单的输出方法,并进行主方法测试:
package com.cljtest.demo.mylock;
import java.util.concurrent.locks.Lock;
public class ReentryDemo {
private Lock lock = new Mylock();
private void methodA(){
lock.lock();
methodB();
System.out.println("输出方法A");
lock.unlock();
}
private void methodB(){
lock.lock();
System.out.println("输出方法B");
lock.unlock();
}
public static void main(String[] args) {
ReentryDemo reentryDemo = new ReentryDemo();
reentryDemo.methodA();
}
}
最终输出结果是两个方法中要输出的语句都成功输出,那么自己的锁就创建成功了