使用java中的sychronized关键字安全访问成员变量

时间:2015-11-13 13:48:34

标签: java multithreading synchronized

当多个线程可以访问成员变量时,我总是使用synchronized来确保访问安全。

我在访问成员变量的方法中使用它

public synchronized void foo()
{
  //do something with the member variable
}

或对该成员的每次访问都被synchronized

包围
synchronized(member)
{
  //do something with the member here
}

我从不在多线程应用程序中使用任何其他机制(如信号量和类似机制)来安全访问成员变量,我想知道我是否忽略了某些事情并且有一个严重的原因我不应该这样做?我使用synchronized因为使用它非常快,因为我不必创建任何其他对象,如信号量。

1 个答案:

答案 0 :(得分:0)

存在其他构造来解决某些问题。他们可以

  • 提高绩效
  • 避免死锁
  • 启用更高级别的并发抽象,否则需要进行非常粗粒度的锁定(当然,您也可以称之为“提高性能”)

提高性能的一个简单示例是读写锁,其中数据结构可以安全地由多个线程使用,只要它们只读取它即可。只有作家才能获得非共享锁。

写时复制/不可变数据结构/快照可以允许应用程序的一部分处理一些稍微过时的数据,例如,用于报告,无需任何锁定,因此不会妨碍应用程序其他部分的进度。

充分复杂的代码,其中同步方法调用也使用锁的其他代码可能最终导致代码路径,其中锁不以相同的顺序进行,这是死锁的处方。乐观方案(尝试锁定或读取 - 修改 - 条件 - 更新 - 重试)可以通过具有可以通知不同层必须重试的错误路径来更优雅地处理这种情况。