【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
public class TwinsLock implements Lock{
private static final class Sync extends AbstractQueuedSynchronizer{
Sync(int count){
if (count <= 0) {
throw new IllegalArgumentException("count must large zere");
}
setState(count);
}
@Override
protected int tryAcquireShared(int reduceCount) {
for(;;){
int current = getState();
int newCount = current - reduceCount;
if (newCount<0 || compareAndSetState(current,newCount)) {
return newCount;
}
}
}
@Override
protected boolean tryReleaseShared(int returnCount) {
for(;;){
int current = getState();
int newCount = current + returnCount;
if (compareAndSetState(current, newCount)) {
return true;
}
}
}
}
private final Sync sync = new Sync(2);
@Override
public void lock() {
sync.acquireShared(1);
}
@Override
public void unlock() {
sync.releaseShared(1);
}
@Override
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
}
@Override
public boolean tryLock() {
return sync.tryAcquireShared(1) > 0;
}
@Override
public boolean tryLock(long time, TimeUnit unit)
throws InterruptedException {
return false;
}
@Override
public Condition newCondition() {
return null;
}
public static class SleepUtils{
public static final void second(long sec) {
try {
TimeUnit.SECONDS.sleep(sec);
} catch (Exception e) {
// TODO: handle exception
}
}
}
public static void main(String[] args) {
final Lock lock = new TwinsLock();
class Worker extends Thread{
@Override
public void run() {
while(true){
lock.lock();
try{
SleepUtils.second(1);
System.out.println(Thread.currentThread().getName());
SleepUtils.second(1);
}finally{
lock.unlock();
}
}
}
}
//启动10个线程
for (int i = 0; i < 10; i++) {
Worker w = new Worker();
w.setDaemon(true);
w.start();
}
//每隔一秒换行
for (int i = 0; i < 10; i++) {
SleepUtils.second(1);
System.out.println();
}
}
}
求大佬指导,为啥方法tryAcquireShared中要这么判断?我把newCount<0去掉结果就输出两行就没了。
if (newCount<0 || compareAndSetState(current,newCount)) {
return newCount;
}
还有启动线程时为啥要设置为setDaemon(true);我注释了之后输出就停不下来了。
如果上面代码不对,求大佬指导哪里错了