首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有另一种使用CAS操作在Java中编写同步块的方法?

是否有另一种使用CAS操作在Java中编写同步块的方法?
EN

Stack Overflow用户
提问于 2015-01-18 19:43:47
回答 2查看 302关注 0票数 2

我有两个同步块,将由两个并发线程大量访问。我想减少争用和上下文切换。是否有一种方法可以在CompareAndSet上使用AtomicBoolean操作来完成这一任务?

例如:

代码语言:javascript
复制
private final Object lock = new Object();

// Thread A executing this
public final void methodA() {
   synchronized(lock) {
       ...
   }
}

// Thread B executing this
public final void methodB() {
    synchronized(lock) {
       ...
    }
}

我不想使用java.util.concurrent.locks.Lock类,因为我认为它没有什么区别。我想用CAS。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-18 19:49:43

您可以将同步块替换为:

代码语言:javascript
复制
private final AtomicBoolean flag = new AtomicBoolean();

while (!flag.compareAndSet(false, true));
try {
  //your code here
} finally {
  flag.set(false);
}

您应该在您的争用场景下测试这两种情况,以确保它确实提高了性能。CAS在小到温和的争论中效果最好。

正如@yshavit、JIT可能已经为您执行了这种优化。所评论的那样,再次测试是很重要的。

票数 6
EN

Stack Overflow用户

发布于 2015-01-18 19:54:55

根据实际情况,使用CAS的自旋锁可能会提高性能,也可能不会提高性能。如果代码块中的代码比较长且耗时,那么同步仍然是您最安全的选择。

您能否尝试使数据不可变,以便不同的线程使用不同的数据副本,而不需要锁?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28014014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档