Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 - Fatal编程技术网

Java中的易失性和同步关键字

Java中的易失性和同步关键字,java,Java,可能重复: 我对两个java关键字synchronized和volatile有点困惑 据我所知,由于java是一种多线程语言,并且通过使用关键字synchronized将强制它在一个线程中执行。我说得对吗 volatile也做同样的事情?本质上,volatile用于表示变量的值将由不同的线程修改 Synchronized是一个关键字,其总体目的是一次只允许一个线程进入代码的特定部分,从而允许我们保护变量或数据,例如,不受来自不同线程的同时修改的破坏 对于long和double而言,读写操作不是

可能重复:

我对两个java关键字
synchronized
volatile
有点困惑

据我所知,由于java是一种
多线程
语言,并且通过使用关键字
synchronized
将强制它在一个线程中执行。我说得对吗


volatile也做同样的事情?

本质上,volatile用于表示变量的值将由不同的线程修改


Synchronized是一个关键字,其总体目的是一次只允许一个线程进入代码的特定部分,从而允许我们保护变量或数据,例如,不受来自不同线程的同时修改的破坏

对于
long
double
而言,读写操作不是原子操作。
volatile
是一个修饰符,您可以在变量上添加它,使读写操作原子化(包括
long
double

这篇文章得到了更多的信息


基本上,它是为了确保如果一个线程更改了变量的值,那么其他线程将看到该更改,并且在其写入时将无法读取该更改。

它与中所述的一样复杂。

同步意味着在给定时间只有一个线程可以访问该方法或代码块


Volatile处理线程之间的通信。这里有一个很好的解释:

volatile和synchronized都保证了可见性,但synchronized也提供了原子性:

  • 如果一个线程读取一个易失性变量,它可以保证看到之前对该变量的写入,包括它们是否由其他线程完成
  • 同步块提供了相同的保证(前提是写入和读取是在同一个监视器中完成的),但也提供了原子性保证:同步块中的所有指令将从同一锁上同步的另一个线程中看起来是原子的

Volatile关键字将使每个线程作为内存位置中的原子操作进行读写。如果不使用volatile,该变量可能会被线程缓存,线程可能会读取/写入缓存副本而不是实际副本。

Java多线程涉及两个问题,确保可以一致地执行多个操作,而不会混合不同线程的操作,以及使变量值的更改可供线程使用,而不是执行更改时的线程

实际上,变量在硬件中的单个位置并不自然存在。不同线程的内部状态或不同硬件缓存中可能存在副本。简单地赋值给变量会从执行赋值的线程的角度自动更改其值

如果变量标记为“volatile”,其他线程将获得更改的值

“同步”还可以确保更改变得可见。具体地说,在同步块结束之前在一个线程中所做的任何更改都将对在同一对象上同步的后续块中的另一个线程所做的读取可见

此外,在同一对象上同步的块被强制按顺序运行,而不是并行运行。这允许我们做一些事情,比如向变量添加一个变量,知道它的值在读取旧值和写入新值之间不会改变。它还允许对多个变量进行一致的更改


我所知道的用Java编写可靠并发代码的最佳方法是阅读“Java是一种多线程语言”。如果你是说Java是线程安全的,那就错了。根据它的说法,它是一种多线程语言。这个页面看起来一点也不可信。Java支持线程,我想如果您在代码中启动多个线程,您就是在创建多线程应用程序。然而Java语言并没有非常新颖的结构来运行线程。一个简单的google搜索提供了很好的答案。它说
volatile
用于减少内存一致性错误?那是什么意思mean@user1315906线程可以缓存变量的值。因此,即使一个线程将更新某些值,也存在其他线程将使用其缓存值的风险。为了防止缓存变量,请使用
volatile
。volatile的主要承诺不是原子性,而是可见性。内存位置中的
ad原子操作是什么意思?对不起,这是打字错误,我的意思是读取或写入变量将是原子操作。volatile的主要承诺不是原子性,而是可见性。我在线程中多次遇到不使用volatile的问题,因为没有共享布尔变量的线程正在访问缓存副本。谢谢。从您提供的链接中理解了
volatile