![]() |
1
7
据我所知,您只需要getAndIncrement()方法的一个变体
|
![]() |
2
5
我想说,除了包装,没关系。当两个方法调用有效地同时进行时,您不能保证哪一个将首先发生。 代码仍然是原子性的,因为无论哪一个先发生,它们都不能相互干扰。
如果
基本上这是说,“我们需要通过减少一些模的倍数,使值回到一个安全的范围内”(这样它就不会改变mod M的值)。它是在一个紧密的循环中完成的,基本上是计算出新值应该是什么,但是只有在没有其他东西改变中间的值时才进行更改。 这可能会导致一个问题 病理的 在这种情况下,有无限多个线程试图增加值,但我认为这实际上是可以的。 |
![]() |
3
1
关于原子性问题:我认为计数器本身不可能提供行为来保证您所暗示的语义。
您要寻找的中介关系到在A处建立的“有效负载”身份排序。 例如,两个线程各自读取一条消息-一个读取X,一个读取Y。您希望确保X获得第一个计数器增量,Y获得第二个计数器增量,即使两个线程同时运行,并且可以跨一个或多个cpu任意调度。 因此,必须在所有步骤A-F中强制执行任何排序,并由计数器外部的某个并发countrol强制执行。例如:
现在我们有了一个以牺牲一些并行性为代价的保证;线程正在互相等待。当严格排序是一项要求时,这确实会限制并发性;这是消息传递系统中的一个常见问题。 关于清单问题。线程安全应该从接口保证的角度来看待。有一个绝对最低的要求:列表必须具有弹性,以应对来自多个线程的同时访问。例如,我们可以想象一个不安全的列表可能会死锁或使列表链接错误,这样任何迭代都将永远循环。下一个要求是,我们应该指定两个线程同时访问时的行为。有很多案子,这里有几个
如果实现在每种情况下都有明确定义的行为,那么它是线程安全的。有趣的问题是什么行为是方便的。 我们可以简单地在列表上同步,因此可以很容易地为a和b提供易于理解的行为。然而,这在并行性方面是有代价的。我认为这样做没有任何价值,因为您仍然需要在更高的级别上进行同步,以获得有用的语义。所以我会有一个接口规范说“添加以任何顺序发生”。 至于迭代——这是一个很难的问题,看看Java集合承诺了什么:不是很多! |
![]() |
4
1
原子的
至于 线程安全性 ,Java并发实践的作者在他们的书中提供了一个定义:
但是,java平台不是一个实时计算平台,因此您无法预测一段代码需要运行多长时间。也就是说,如果你想
现在,什么是线程安全还是不安全?我认为这完全取决于需要做什么。如果你只需要避免列表被破坏
因此,我认为如果没有我们正在努力实现的特定功能,就无法定义线程安全性。
著名的
著名的String.hashCode()技巧:
|
![]() |
a a · 为什么在这个可重入锁示例中需要引用计数? 2 年前 |
![]() |
Grant · goroutines有高空闲唤醒电话 2 年前 |
![]() |
hoaz · 如何安全地清理并发映射 6 年前 |
![]() |
Alanpatchi · int基元类型的volatile声明 6 年前 |