Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用同步化关键字安全访问成员变量_Java_Multithreading_Synchronized - Fatal编程技术网

在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是的,这里就是这样,它只用于从多个线程访问内部数据。