package com.wangyifei;
import java.util.Date;
import java.util.concurrent.*;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
/**
* @author WangYifei
* @date 2021-03-13 17:01
* @describe
*/
public class Test {
public static void main(String[] args) {
MyLock lock = new MyLock();
Thread t1 = new Thread(() -> {
if (lock.tryLock()) {
try {
System.out.println(new Date() + "测试1");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
});
t1.start();
new Thread(() -> {
if (lock.tryLock(3, TimeUnit.SECONDS)) {
try{
System.out.println(new Date() + "测试2");
} finally {
lock.unlock();
}
}
}).start();
}
}
class MyLock implements Lock{
class MySync extends AbstractQueuedSynchronizer {
/**
* 上锁,独占
* @param arg
* @return
*/
@Override
protected boolean tryAcquire(int arg) {
if (getState() != 0) {
return false;
}
if (compareAndSetState(0, 1)) {
setState(1);
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
/**
* 释放,独占
* @param arg
* @return
*/
@Override
protected boolean tryRelease(int arg) {
// 为什么把setState 放在下面?因为state是 volatile 的,在下方会添加写屏障,
// 将写屏障之前的写操作全部直接更新到主存。
setExclusiveOwnerThread(null);
setState(0);
return true;
}
protected Condition getCondition() {
return new ConditionObject();
}
}
MySync sync = new MySync();
/**
* 上锁
*/
@Override
public void lock() {
sync.acquire(1);
}
/**
* 上锁,可打断
* @throws InterruptedException
*/
@Override
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
}
/***
* 重新尝试上锁
* @return
*/
@Override
public boolean tryLock() {
return sync.tryAcquire(1);
}
/**
* 规定时间内,尝试上锁
* @param time
* @param unit
* @return
* @throws InterruptedException
*/
@Override
public boolean tryLock(long time, TimeUnit unit) {
try {
return sync.tryAcquireNanos(1, unit.toNanos(time));
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}
/**
* 释放锁
*/
@Override
public void unlock() {
sync.release(1);
}
@Override
public Condition newCondition() {
return sync.getCondition();
}
}
总感觉哪里有问题= =没找到