自定义锁
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+""); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通