Tag: synchronized block

AtomicBoolean vs synchronized块

我试图通过用AtomicBoolean替换一些synchronized块来减少代码中的线程争用。 这是一个synchronized的例子: public void toggleCondition() { synchronized (this.mutex) { if (this.toggled) { return; } this.toggled = true; // do other stuff } } 和AtomicBoolean的替代方案: public void toggleCondition() { if (!this.condition.getAndSet(true)) { // do other stuff } } 利用AtomicBoolean的CAS属性应该比依赖同步更快,所以我运行了一些微基准测试 。 对于10个并发线程和1000000次迭代, AtomicBoolean只比synchronized块快一点。 使用AtomicBoolean:0.0338在toggleCondition()上花费的平均时间(每个线程) 使用synchronized:0.0357在toggleCondition()上花费的平均时间(每个线程) 我知道微基准值得他们值得,但差异不应该更高吗?

使用同步块的Java中的并发性未给出预期结果

下面是一个简单的java程序。 它有一个名为“cnt”的计数器,它会递增,然后添加到名为“monitor”的List中。 “cnt”由多个线程递增,并且值被多个线程添加到“monitor”。 在方法“go()”的末尾,cnt和monitor.size()应该具有相同的值,但它们不具有相同的值。 monitor.size()确实有正确的值。 如果通过取消注释其中一个已注释的同步块来更改代码,并注释掉当前未注释的块,则代码会生成预期结果。 此外,如果将线程计数(THREAD_COUNT)设置为1,则代码会生成预期结果。 这只能在具有多个真实核心的机器上重现。 public class ThreadTester { private List monitor = new ArrayList(); private Integer cnt = 0; private static final int NUM_EVENTS = 2313; private final int THREAD_COUNT = 13; public ThreadTester() { } public void go() { Runnable r = new Runnable() { @Override public void run() { […]

同步块无法正常工作

这项练习直接来自Kathy Seirra和Bert Bates的SCJP 同步代码块 在本练习中,我们将尝试同步一段代码。 在该代码块中,我们将获得对象的锁定,以便其他线程在代码块执行时无法修改它。 我们将创建三个线程,它们都将尝试操作同一个对象。 每个线程将输出一个单个字母100次,然后将该字母递增1。 我们将使用的对象是StringBuffer。 我们可以在String对象上进行同步,但是一旦创建了字符串就无法修改它们,因此我们无法在不生成新的String对象的情况下增加字母。 最终输出应该有100个As,100个B和100个C,所有这些都是不间断的。 创建一个类并扩展Thread类。 重写Thread的run()方法。 这是同步代码块的用武之地。 为了让我们的三个线程对象共享同一个对象,我们需要创建一个在参数中接受StringBuffer对象的构造函数。 synchronized代码块将从步骤3获取StringBuffer对象的锁定。 在块中,输出StringBuffer 100次,然后在StringBuffer中递增字母。 您可以在第6章中查看有助于此的StringBuffer方法。 最后,在main()方法中,使用字母A创建一个StringBuffer对象,然后创建我们类的三个实例并启动它们中的所有三个。 我已经为上面的练习编写了以下课程(而不是100我打印10个字符) class MySyncBlockTest extends Thread { StringBuffer sb; MySyncBlockTest(StringBuffer sb) { this.sb=sb; } public static void main (String args[]) { StringBuffer sb = new StringBuffer(“A”); MySyncBlockTest t1 = new MySyncBlockTest(sb); MySyncBlockTest t2 = new MySyncBlockTest(sb); […]