package TestAQS; import sun.misc.Unsafe; import java.lang.reflect.Field; import java.util.concurrent.locks.AbstractQueuedSynchronizer; public class OtherLock { public int getState() { return state; } public void setState(int state) { this.state = state; } public Thread getThread() { return thread; } public void setThread(Thread thread) { this.thread = thread; } private static final Unsafe unsafe = reflectGetUnsafe(); private int state=0; private Thread thread; public void lock() throws NoSuchFieldException{ for (;;){ if (unsafe.compareAndSwapInt(this,unsafe.objectFieldOffset(OtherLock.class.getDeclaredField("state")),0,1)) { this.setState(1); this.setThread(Thread.currentThread()); System.out.println("获取锁"+Thread.currentThread().getId()); break; } } } public void unlock() throws NoSuchFieldException{ unsafe.compareAndSwapInt(this,unsafe.objectFieldOffset(OtherLock.class.getDeclaredField("state")),1,0); this.setThread(null); System.out.println("释放锁"+Thread.currentThread().getId()); } public static Unsafe reflectGetUnsafe() { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); return (Unsafe) field.get(null); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } return null; } }
使用锁:
static int num=0; static void test1() throws NoSuchFieldException,InterruptedException{ OtherLock otherLock=new OtherLock(); CountDownLatch countDownLatch=new CountDownLatch(100); for (int i=0;i<100;i++){ new Thread(()->{ try { otherLock.lock(); num++; otherLock.unlock(); countDownLatch.countDown(); } catch (Exception ex){} }).start(); } // Thread.sleep(3000); countDownLatch.await(); log.info(num+""); }