顺序一致性和primefaces性之间有什么区别?
我读到java volatile是顺序一致但不是primefaces的。 对于atomicity java提供了不同的库。
有人可以用简单的英语解释两者之间的差异吗?
(我相信问题范围包括C / C ++,因此添加这些语言标签以吸引更多的观众。)
想象一下这两个变量在一个类中:
int i = 0; volatile int v = 0;
而这两种方法
void write() { i = 5; v = 2; } void read() { if (v == 2) { System.out.println(i); } }
volatile语义保证read
将打印5或不打印(假设当然没有其他方法正在修改字段)。 如果v
不是易失性的,那么read
也可以打印0,因为i = 5
并且v = 2
可能已被重新排序。 我想这就是顺序一致性的意思,它具有更广泛的含义。
另一方面,volatile不保证primefaces性。 因此,如果两个线程同时调用此方法(v是相同的volatile int
):
void increment() { v++; }
你不能保证v会增加2.这是因为v++
实际上是三个语句:
load v; increment v; store v;
并且由于线程交错,v只能递增一次(两个线程都将加载相同的值)。
假设你有这两个变量:
public int a = 0; public volatile int b = 0;
并假设有一个线程
a = 1; b = 2;
如果另一个线程读取这些值并看到b == 2,那么它保证也会看到== 1。
但是读取线程可以看到a == 1
和b == 0
,因为这两个写入不是primefaces操作的一部分,因此读取线程可能会看到在第一个线程为b
分配值之前对a
进行的更改。
要使这两个写入primefaces,您需要同步对这两个变量的访问:
synchronized (lock) { a = 1; b = 2; } ... synchronized (lock) { System.out.println("a = " + a + "; b = " + b); }
在这种情况下,读取线程将看到a == 0
和b == 0
,或a == 1
和b == 2
,但从不是中间状态。
- javax.mail.MessagingException:无法连接到SMTP主机:localhost,port:25
- 如何将子进程stdout / stderr重定向到Java中的主进程stdout / stderr?