1.利用synchronized实现
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class MyReentraLock implements Lock{
private boolean isLocked=false;
Thread lockBy=null;
int lockCount=0;
@Override
public synchronized void lock() {
Thread current=Thread.currentThread();
while(isLocked&¤t!=lockBy) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
isLocked=true;
lockBy=current;
lockCount++;
}
@Override
public synchronized void unlock() {
if(lockBy==Thread.currentThread()) {
lockCount--;
if(lockCount==0) {
notify();
isLocked=false;
}
}
}
@Override
public void lockInterruptibly() throws InterruptedException {
// TODO Auto-generated method stub
}
@Override
public boolean tryLock() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
// TODO Auto-generated method stub
return false;
}
@Override
public Condition newCondition() {
// TODO Auto-generated method stub
return null;
}
}
2.利用cas
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
public class MyLock implements Lock{
//
private AtomicReference<Thread> owner=new AtomicReference<>();
//存放阻塞队列
LinkedBlockingQueue<Thread> waiters=new LinkedBlockingQueue<>();
@Override
public void lock() {
//成功 owner为null
//抢不到情况
while(!owner.compareAndSet(null, Thread.currentThread())) {
//抢不到就加入阻塞队列
waiters.add(Thread.currentThread());
LockSupport.park();//当前线程阻塞
waiters.remove(Thread.currentThread());
}
//成功抢到
}
@Override
public void unlock() {
//只有持有锁的线程才能成功解锁
if(owner.compareAndSet(Thread.currentThread(), null)) {//解锁成功
//唤醒其他等待的线程
for(Object object:waiters.toArray()) {
Thread next=(Thread) object;
LockSupport.unpark(next);
}
}
}
@Override
public void lockInterruptibly() throws InterruptedException {
// TODO Auto-generated method stub
}
@Override
public boolean tryLock() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
// TODO Auto-generated method stub
return false;
}
@Override
public Condition newCondition() {
// TODO Auto-generated method stub
return null;
}
}