import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;/**
* Created by Martin on 2021/9/2 22:44
*
* 手写lock锁
*/
public class TestLock implements Lock {//登记我们的线程
AtomicReference<Thread> owner=new AtomicReference<Thread>();//队列--存放那些没有抢到锁的线程(线程安全+高效) delayqueue---限时订单
LinkedBlockingQueue waiters=new LinkedBlockingQueue();
@Override
public voidlock(){while(!owner.compareAndSet(null,Thread.currentThread())){//用cas确保线程安全//false,如果抢不到了
waiters.add(Thread.currentThread());
LockSupport.park();//让当前的线程阻塞}}
@Override
public voidlockInterruptibly() throws InterruptedException {}
@Override
public boolean tryLock(){return false;}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return false;}
@Override
public voidunlock(){//只有持有锁的线程才能解锁if(owner.compareAndSet(Thread.currentThread(),null)){//唤醒其它等待的线程for(Object object: waiters.toArray()){
Thread next=(Thread) object;
LockSupport.unpark(next);//清除队列里面的线程
waiters.remove(Thread.currentThread());}}}
@Override
public Condition newCondition(){return null;}}
主程序测试代码
import java.util.concurrent.atomic.AtomicInteger;/**
* Created by Martin on 2021/9/2 19:44
*
* 多线程操作共享变量--原之类操作
*/
public class handDemo {int i=60000;//共享变量
TestLock testLock = new TestLock();//多个线程同时跑order方法
public voidorder(){
testLock.lock();
try {
i--;//i--操作} finally {
testLock.unlock();}}//模拟高并发场景
public staticvoidmain(String[] args) throws InterruptedException {
handDemo handDemo = new handDemo();for(int j=0;j<6;j++){
new Thread(()->{for(int k=0;k<10000;k++){
handDemo.order();}}).start();}
Thread.sleep(3000);
System.out.println(handDemo.i);}}