您好,我是湘王,这是我的头条号湘王说,欢迎您来,欢迎您再来 之前说过,AQS(抽象队列同步器)是Java锁机制的底层实现。既然它这么优秀,是骡子是马,就拉出来溜溜吧。 首先用重入锁来实现简单的累加,就像这样: 运行结果显示数据有重复: 这么简单的计算都能出现重复,这肯定是无法接受的。 再用独占锁来试试看: 可以看到,实现lock接口,就需要实现若干自定义的接口。然后以内部类继承AQS的方式,实现排他锁,昨天也说过,AQS中tryAcquire()和tryRelease()是一一对应的,也就是也管获取,一个管释放,所以代码是: 然后再用AQS实现lock接口的方法: 然后再运行测试: 可以看到,结果无论怎么样都不会再重复了。 这个只是简单的累加,接下来用AQS来实现一个实际的生活场景。比如周末带女票或男票去步行街吃饭,这时候人特别多,需要摇号,而且一次只能进去三张号(不按人头算,按叫到的号来算),该怎么实现呢? 可以顺着这个思路:摇号机虽有很多号,但它本质上是个共享资源,很多人可以共享,但是每次共享的数量有限。这其实就是个可以指定数量的共享锁而已。 既然有了思路,那接下来就好办了。 还是一样实现Lock接口,但这次是用AQS实现共享锁。 然后再来改造之前实现的接口: 接下来就该测试咱们需要的效果是否能实现了: 这里有20个号,每次只能发放3张,运行之后就可以看到确实如此。 AQS是个很神奇也很好玩的东西,就像它的作者(也是除了高司令就是对Java影响最大的那个人,整个Java的多线程juc包代码就是他编写的)DougLea在AbstractQueuedSynchronizer的注释中所说:AQS只是一个框架,至于怎么玩,就是你的事了! 感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸 我在头条