自己看着讲解的视频,敲了一边代码。
public class MyLock {
private Sync sync;
class Sync extends AbstractQueuedSynchronizer{
@Override
protected boolean tryAcquire(int acquires) {
//当前线程
final Thread current = Thread.currentThread();
int c = getState();
/**
* 0:当前锁是空闲
* 1:有锁
*/
if(c == 0){
if(compareAndSetState(0,acquires)){
setExclusiveOwnerThread(current);
return true;
}
}else if(current == getExclusiveOwnerThread()){
int next = c + acquires;
setState(next);
return true;
}
return false;
}
@Override
protected boolean tryRelease(int releases) {
int c = getState() – releases;
if(Thread.currentThread() != getExclusiveOwnerThread()){
throw new IllegalMonitorStateException();
}
boolean free = false;
if (c == 0){
free = true;
setExclusiveOwnerThread(null);
}
setState(c);
return free;
}
/**
* 显示当前持有锁的线程
*/
public void showExclusiveThread(){
if (getExclusiveOwnerThread() != null) {
System.out.println(“currentThread is “+getExclusiveOwnerThread().getName());
}
}
}
public MyLock(){
sync = new Sync();
}
public void lock(){
sync.acquire(1);
}
public void unLock(){
sync.release(1);
}
public void showLockThread(){
sync.showExclusiveThread();
}
public static void main(String[] args) throws InterruptedException {
final MyLock lock = new MyLock();
Thread t1 = new Thread(()->{
try{
System.out.println(“t1 start…………….”);
lock.lock();
System.out.println(“t1 get lock…………….”);
Thread.sleep(5000);
System.out.println(“t1 return…………….”);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unLock();
}
});
t1.setName(“t1”);
Thread t2 = new Thread(()->{
try{
System.out.println(“t2 start…………….”);
lock.lock();
System.out.println(“t2 get lock…………….”);
Thread.sleep(5000);
System.out.println(“t2 return……………”);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unLock();
}
});
t2.setName(“t2”);
t1.start();
t2.start();
Thread.sleep(2000);
lock.showLockThread();
}
}