加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 从不拥有它的线程解锁锁,或重新设计以避免这种情况?

发布时间:2020-12-15 08:32:07 所属栏目:Java 来源:网络整理
导读:我有一个归档对象,它管理各种字节数组,并分发 InputStream 和 OutputStream 来读取和写入它们.每个字节数组都有一个关联的 ReentrantReadWriteLock . 归档生成的InputStream子类的构造函数获取相关数据的锁,而close()释放锁.现在,问题是: 假设我有一个任务
我有一个归档对象,它管理各种字节数组,并分发 InputStreamOutputStream来读取和写入它们.每个字节数组都有一个关联的 ReentrantReadWriteLock.

归档生成的InputStream子类的构造函数获取相关数据的锁,而close()释放锁.现在,问题是:

假设我有一个任务将在另一个需要从归档输入的线程上运行,在它启动之前将InputStream作为参数给出,并且负责在流完成时关闭流.这些要求似乎与我的数据存档使用的锁定机制不兼容,因为

> InputStream是在与其关闭的线程不同的线程上创建的.
>必须由拥有它的线程释放ReentrantReadWriteLock.

重写程序中希望将InputStream作为输入的部分以避免#1是不方便的并且使这些部分不那么灵活.使用一种允许更改所有权的锁可以让我避免使用#2,但是我没有看到Java API中的任何锁可以解决这个问题而且我不是非常热衷于将自定义锁定在一起,如果我不这样做的话必须.

这个问题有什么解决方案?

解决方法

最简单的方法是为客户端提供除InputStream子类之外的其他东西,即使这意味着稍微重构一些.在您当前的设计中,您不能指望您的客户释放锁,如果其中一个没有?这不是很好的封装.

让归档对象管理锁,并为您的客户提供一个简单的API来获取数据.即使这意味着改变一些API.

不同线程锁定和释放同一对象的问题清楚地表明您在当前设计中遇到了一些错误.关于上面提到的重构工作,它会为你做进一步的工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读