public class TestAQS {
public static void main(String[] args) {
MyLock myLock=new MyLock();
new Thread(()->{
myLock.lock();
try{
System.out.println("locking...");
}finally {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("unlocking..");
myLock.unlock();
}
},"t1").start();
new Thread(()->{
myLock.lock();
try{
System.out.println("locking...");
}finally {
System.out.println("unlocking..");
myLock.unlock();
}
},"t2").start();
}
}
//自定义不可重入锁
class MyLock implements Lock{
private Mysnc sync=new Mysnc();
class Mysnc extends AbstractQueuedSynchronizer {
@Override
protected boolean tryAcquire(int arg) {
if(compareAndSetState(0,1))
{
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
@Override
protected boolean tryRelease(int arg) {
setExclusiveOwnerThread(null);
setState(0);
return true;
}
@Override
protected boolean isHeldExclusively() {
return getState()==1;
}
}
@Override
public void lock() {
sync.acquire(1);
}
@Override
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
}
@Override
public boolean tryLock() {
return sync.tryAcquire(1);
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return sync.tryAcquireNanos(1,unit.toNanos(time));
}
@Override
public void unlock() {
sync.release(1);
}
@Override
public Condition newCondition() {
return newCondition();
}
}
自定义不可重入锁代码
最新推荐文章于 2022-08-15 19:18:16 发布