什么是primefaces?

这是两个primefaces操作:

int value = 5; Object obj = new Object(); 

但是当使用原语作为方法参数时,这会被视为primefaces操作: public void setValue(int val, Object obj){
this.value = val; // Atomic?
this.obj = obj; // Not atomic?
}
public void setValue(int val, Object obj){
this.value = val; // Atomic?
this.obj = obj; // Not atomic?
}

? 对象引用的副本不是primefaces的,因为它包含读取和写入,对吧?

说对象引用进行primefaces操作的唯一方法是将其声明为null或为其分配新对象,如:

 Object obj = null; 

 Object obj = new Object(); 

如果上面方法中的参数是对象的引用,那么操作就不是primefaces的,对吧?

一般来说,这是正确的。 一个好的经验法则是考虑根本没有primefaces性,即使是像以下基元:

 int b,c; int a = ++b - c; 

只有原语,但整个任务可能不是primefaces的。

如果你需要primefaces操作,你有不同的可能性:

  • 同步块
  • 不可变对象
  • 特定库(java.util.concurrent.atomic)

当线程读取基元(long和double除外)或对象引用的值时,它会看到它在此变量中设置的值,或者另一个线程在此变量中设置的值。

但是,虽然在一个线程中为共享变量赋值是primefaces的,但这并不意味着所有其他线程都会立即看到新值。 为此,应将变量声明为volatile。 volatile也会写入长双primefaces。 不过,在这种情况下,我更喜欢使用AtomicXxx(AtomicLong,AtomicBoolean等)。

如果要primefaces地更改两个共享变量的值,则应使用唯一锁将每个访问(读取和写入)同步到这些变量。

而且,每次“检查然后行动”或“读取然后写入”操作都是非primefaces的。 这意味着这些操作也需要同步:

 a++; // read a, increment value, write value to a if (a > 0) {a = b;} // check value of a, then assign new value to a. 

你问题中的每一个操作都是primefaces的。 但是在setValue() ,您有两个primefaces操作。 整个setValue调用不是primefaces的。

到JLS!

当线程使用变量的值时,它获得的值实际上是由该线程或某个其他线程存储到变量中的值。 即使程序不包含正确同步的代码,也是如此。 例如,如果两个线程将对不同对象的引用存储到同一引用值中,则该变量随后将包含对一个对象或另一个对象的引用,而不是对某个其他对象的引用或损坏的引用值。

所以赋值是primefaces的。

 public synchronized void setValue(int val, Object obj) 

现在整个函数都是“primefaces”,这个术语我还没有在Java中看到过