错误版本:多个线程同时判断state==0,虽然compareAndSet只有一个完成,但是没完成的也会篡改下面的信息,应该让compareAndSet成为判断条件
import sun.misc.Unsafe;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
public class CustomLock {
public final Sync sync;
public CustomLock(){
sync = new Sync();
}
public boolean lock(){
return sync.tryAcquire(0);
}
public void unlock(){
sync.tryRelease(0);
}
static class Sync extends AbstractQueuedSynchronizer{
@Override
protected boolean tryAcquire(int arg){
int state = getState();
Thread t = Thread.currentThread();
if(state == 0){
compareAndSetState(0,1);
setExclusiveOwnerThread(t);
System.out.println(t.getId()+"获取了锁");
return true;
}
else if(getExclusiveOwnerThread()==t){
setState(state+1);
System.out.println(t.getId()+"第"+state+"次进入了锁");
return true;
}
return false;
}
@Override
protected boolean tryRelease(int arg) {
int state = getState();
Thread t = Thread.currentThread();
setState(state-1);
if(state==0){
System.out.println(t.getId()+"释放了锁");
setExclusiveOwnerThread(null);
}else {
System.out.println(t.getId()+"退出了第"+(state+1)+"次锁");
}
return true;
}
}
public static void main(String[] args) {
CustomLock customLock = new CustomLock();
new Thread(() -> {
customLock.lock();
customLock.lock();
customLock.unlock();
customLock.unlock();
}).start();
new Thread(()->{
customLock.lock();
customLock.lock();
customLock.unlock();
customLock.unlock();
}).start();
}
}
终于写出了正确版的,但是这个版本忽略了tryAcqiure/tryRelease的入参和tryRelease的出参作用,道阻且长,继续加油!
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
public class CustomLock {
public final Sync sync;
public CustomLock(){
sync = new Sync();
}
public boolean lock(){
return sync.tryAcquire(0);
}
public void unlock(){
sync.tryRelease(0);
}
static class Sync extends AbstractQueuedSynchronizer{
@Override
protected boolean tryAcquire(int arg){
int state = getState();
Thread t = Thread.currentThread();
if(compareAndSetState(0,1)){
setExclusiveOwnerThread(t);
System.out.println(t.getId()+"获取了锁");
return true;
}
if(getExclusiveOwnerThread()==t){
setState(state+1);
System.out.println(t.getId()+"第"+getState()+"次进入了锁");
return true;
}
return false;
}
@Override
protected boolean tryRelease(int arg) {
int state = getState();
Thread t = Thread.currentThread();
setState(state-1);
if(state==0){
System.out.println(t.getId()+"释放了锁");
setExclusiveOwnerThread(null);
}else {
System.out.println(t.getId()+"退出了第"+(getState()+1)+"次锁");
}
return true;
}
}
public static void main(String[] args) {
CustomLock customLock = new CustomLock();
new Thread(() -> {
customLock.lock();
customLock.lock();
customLock.unlock();
customLock.unlock();
}).start();
new Thread(()->{
customLock.lock();
customLock.lock();
customLock.unlock();
customLock.unlock();
}).start();
}
}