java中自己实现lock锁的方法就是定义一个类继承Lock接口,重写Lock接口中的抽象方法,在类中定义一个静态内部类继承AQS并重写AQS中的protected方法
class NewBeeLock implements Lock{
private Sync sync = new Sync();
static class Sync extends AbstractQueuedSynchronizer{
@Override
//规定同步状态为1
protected boolean tryAcquire(int arg) {
if(arg != 1){
throw new RuntimeException("arg不为1!");
}
//使用CAS尝试改变同步状态
if(compareAndSetState(0,1)){
//当前线程成功获取到锁
//将持有锁的线程设为当前线程
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
@Override
protected boolean tryRelease(int arg) {
if(getState() == 0){
throw new IllegalMonitorStateException();
}
//设置锁不被任何线程持有
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,time);
}
@Override
public void unlock() {
sync.release(1);
}
@Override
public Condition newCondition() {
return null;
}
}
class myThread implements Runnable{
NewBeeLock lock = new NewBeeLock();
@Override
public void run() {
try {
lock.lock();
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
public class Test {
public static void main(String[] args) {
myThread mt = new myThread();
for (int i = 1;i < 10;i++){
new Thread(mt).start();
}
}
}
可以打开调试看线程状态就能验证自己写的锁是否能锁住