Java 基于AQS实现一个同步器
前面说了这个多,我们可以自己尝试实现一个同步器,我们可以简单的参考一下reentrantlock这个类的实现方式,我们就简单的实现一个不可重入的独占锁吧!
一.简单分析reentrantlock的结构
下图所示,直接实现了lock这个接口,然后定义了一个内部类继承aqs,暂时不考虑公平锁和非公平锁,前面说aqs的时候说过,留有tryacquire,tryrelease这两个方法在具体子类中根据实际情况实现的,可想而知这个内部类主要的是实现tryacquire,tryrelease;
我们看看lock接口,这些方法就是我们需要实现的;主要是获取锁和释放锁,还有一个实现条件变量的方法;
这里注意一下,有的方法后面带有interruptibly这种字样的,这个方法表示如果该线程假如在阻塞队列中挂起了,这时有另外一个线程去调用这个线程的中断方法,那么就会立即抛出异常;不带interruptibly就是不会对中断进行响应!
我们如果看看reentrantlock里面的lock,unlock等方法的实现,可以知道都是调用的sync的方法,也就是aqs中的一些方法,所以在这里我们可以把sync看做是一个工具类,我们主要是使用lock接口的这些方法来实现我们锁的功能;
二.创建一个锁mynonlock
我们只需要创建一个类实现lock类,然后这个类中有一个内部类mysync继承aqs,然后在lock的那些实现方法中调用mysync对象的某些方法就行了;
三.生产者消费者模式
我们还可以根据我们自己实现的锁mynonlock实现一下生产者消费者模式,注意,这个锁是不可重入锁,不需要记录持有锁的线程获取锁的次数,而且state的值为0表示当前锁没有被占用,为1表示已经被占用了;
可以看到队列中最多只能是3个字符串,最后都能被消费完毕!
以上就是基于aqs实现一个同步器的详细内容,更多关于aqs实现同步器的资料请关注其它相关文章!