在java中使用同步化关键字安全访问成员变量
当多个线程可以访问一个成员变量时,我总是使用在java中使用同步化关键字安全访问成员变量,java,multithreading,synchronized,Java,Multithreading,Synchronized,当多个线程可以访问一个成员变量时,我总是使用synchronized使te访问安全 我在访问成员变量的方法中使用了它 public synchronized void foo() { //do something with the member variable } 或者每个对成员的访问都被synchronized synchronized(member) { //do something with the member here } 我从来没有在多线程应用程序中使用任何其他机制,如
synchronized
使te访问安全
我在访问成员变量的方法中使用了它
public synchronized void foo()
{
//do something with the member variable
}
或者每个对成员的访问都被synchronized
synchronized(member)
{
//do something with the member here
}
我从来没有在多线程应用程序中使用任何其他机制,如信号量和类似的机制来获得对成员变量的安全访问,我想知道我是否忽略了一些东西,为什么我不应该这样做呢?我使用了
synchronized
,因为它使用起来非常快,因为我不必创建任何其他对象,如信号量。存在其他构造来解决某些问题。他们可以
- 提高性能
- 避免僵局
- 启用更高级别的并发抽象,否则需要非常粗粒度的锁定(当然,您也可以称之为“提高性能”)
如果同步方法调用其他也使用锁的代码,那么足够复杂的代码最终可能会导致代码路径,在这些代码路径中,锁的获取顺序不同,这就是死锁的原因。乐观方案(try lock或read modify conditional update或retry)可以通过一个错误路径来通知另一层它必须重试,从而更优雅地处理此类情况。
同步化(成员)
不会“保护”成员,无论我们所说的保护是什么意思。@biziclop如果确实每个对成员的访问都被这样一个子句包围,那么它就是这样做的。@madpysicator是的,但是用synchronized(“foo”){}
包围成员的每个访问也是如此。我想说的是,监视器对象的选择没有什么特别之处,对象的“内容”和与其关联的监视器之间没有任何联系。如果OP认为存在,那就是一个问题。如果您只想从多个线程安全地访问数据,synchronized
通常是一种方法。在创建和管理线程时,您可能需要更细粒度的控制。@Warren Dew是的,这里就是这样,它只用于从多个线程访问内部数据。