看看AQS 源码其核心就只有两个:volatile 和 Unsafe 然后添加一个管理线程的任务池。但是其核心的实现和hold 住 当前线程并且让其执行要是如何实现并做的,我按照其原理写了一个简答的同理demo,
public class SelfAQS {
public volatile int state = 0;
public boolean lock() {
while(state != 0) {
}
return true;
}
public boolean unlock() {
this.state = 0;
return true;
}
public void setState(int state) {
this.state = state;
}
}
测试:
SelfAQS selfLock = new SelfAQS();
for(int j = 0 ; j < 10; j++) {
new Thread(() ->{
selfLock.lock();
i++;
System.out.println("threadId: "+Thread.currentThread().getId()+" i="+i);
selfLock.unlock();
}).start();
new Thread(() ->{
selfLock.lock();
i++;
System.out.println("threadId: "+Thread.currentThread().getId()+" i="+i);
selfLock.unlock();
}).start();
}
运行结果:
threadId: 27 i=1
threadId: 28 i=2
threadId: 29 i=3
threadId: 32 i=4
threadId: 30 i=5
threadId: 34 i=6
threadId: 35 i=7
threadId: 46 i=20
threadId: 37 i=20
threadId: 31 i=20
threadId: 41 i=20
threadId: 40 i=20
threadId: 36 i=20
threadId: 42 i=20
threadId: 39 i=20
threadId: 45 i=20
threadId: 44 i=20
threadId: 43 i=20
threadId: 33 i=20
threadId: 38 i=20