![]() |
1
2
没有在运行时检查这种情况的文档化方法,如果有,我会怀疑任何使用它的代码,因为任何基于调用堆栈改变其行为的代码都很难调试。 真正的acid语义并不容易实现,我个人也不会尝试;这就是我们有数据库的目的,如果需要快速/可移植的代码,可以使用内存中的数据库。如果你只是想要强制的单线程语义,这是一个比较容易驯服的野兽,尽管作为免责声明,我应该提到,从长远来看,你最好只是提供原子操作,而不是试图阻止多线程访问。 假设你有一个很好的理由想这样做。下面是一个概念证明类,您可以使用它:
这里发生了很多事,但我会帮你把它分解:
使用
所有这些只是使用
下面是一个测试程序:
正如代码(希望)所暗示的,只有
这并不是为生产准备的代码,但它应该为您提供必须做什么的基本概念,以便(a)防止跨线程调用和(b)允许任何线程拥有对象,只要没有其他线程在使用它。 |
![]() |
2
4
如果不自己跟踪状态(例如使用某种信号量),我认为这是不可能的。但即使是这样,也会严重违反封装。您的方法通常不应该关心它们是否在特定的锁定上下文中执行。 |
![]() |
3
2
让我们重新设计您的类,使它像事务一样实际工作。
在调用commit之前,不会传播更改。 在commit中,您可以获取一个锁并设置目标对象的属性。 |
![]() |
4
1
您可以覆盖
你也可以玩
|
![]() |
5
1
使用线程本地存储可以存储锁的进入和退出。 |
![]() |
6
1
如果您的要求是在addone()或removeone()方法期间必须获取锁,那么为什么不简单地在每个方法中获取锁呢?如果打电话的人已经为你取得了锁,那就不成问题了。 但是,如果您的要求是在同时调用addone()和removeone()之前必须获取锁(因为在实例上执行的其他并发操作可能不安全),那么您可能应该考虑更改公共接口,以便可以在内部处理锁。不涉及客户端代码的细节。 实现后者的一种可能方法是为必须在addone和removeone之前和之后调用的开始和结束更改提供方法。如果在begin-end作用域之外调用addone或removeone,则应引发异常。 |
![]() |
7
0
我遇到了同样的问题,创建了一个helper类,如下所示:
然后,您可以创建这样包装的实例:
像这样使用:
对于我的特殊情况,我只想要一个强制锁(如果两个线程表现良好,就不应该试图同时获取锁),所以我抛出了一个异常。您可以很容易地修改它以执行更典型的锁定,并且仍然可以利用isbusy。 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
![]() |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
![]() |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
![]() |
rhymes · 如何让线程操作相同的java列表 2 年前 |