在编程中“primefaces”是什么意思?
在Effective Java书中,它指出:
语言规范保证读或写variables是primefaces的,除非variables的types是
long
或double
[JLS,17.4.7]。
在Java编程或一般编程环境中,“primefaces”是指什么?
这是一个例子,因为一个例子比一个长的解释更清晰。 假设foo
是long
types的variables。 以下操作不是primefaces操作:
foo = 65465498L;
事实上,variables是用两个单独的操作写入的:一个写入前32位,而另一个写最后32位。 这意味着另一个线程可能会读取foo
的值,并看到中间状态。 使操作primefaces化包括使用同步机制,以确保操作可以从其他任何线程看作是一个单一的primefaces操作(即不能拆分)。 这意味着任何其他的线程,一旦操作被创build,将会在赋值之前或赋值之后看到foo
的值。 但从来没有中间价值。
一个简单的方法是使variablesvolatile:
private volatile long foo;
或者同步对variables的每个访问:
public synchronized void setFoo(long value) { this.foo = value; } public synchronized long getFoo() { return this.foo; } // no other use of foo outside of these two methods, unless also synchronized
或者用AtomicLongreplace它:
private AtomicLong foo;
“primefaces操作”是指从所有其他线程的angular度来看似乎是瞬时的操作。 担保适用时,您不必担心部分完成的操作。
这是“系统的其他部分出现瞬间”,属于计算过程中线性化的分类。 要进一步引用链接的文章:
primefaces性是对并发进程的隔离的保证。 另外,primefaces操作通常具有成功或失败的定义 – 它们要么成功地改变系统的状态,要么没有明显的影响。
因此,例如,在数据库系统的情况下,可以有“primefaces提交”,这意味着你可以将更新的变更集推送到关系数据库,并且这些变更将全部提交,或者根本不提交在这种情况下,数据不会被破坏,并导致锁和/或队列,下一个操作将是一个不同的写或读,但只有在事实之后。 在variables和线程的情况下,这是相同的,适用于内存。
你的引用强调,这不需要在所有情况下的行为。
在古代哲学中,primefaces是物质的最终单位,物质现实的复杂观点是以此为基础的。 在计算机编程中,primefaces描述了一个基本上不可分割,不可改变,整体和不可约的单一行为或对象。 以下是一些用法:
1)在结构化查询语言中,primefaces函数是指在电源中断或exception结束时,完成或恢复到原来的状态。
2)在一些基于Unix的操作系统中,primefaces操作是在设置掩码和接收信号来改变掩码之间的时间内不发生变化的操作。
3)在一些编程语言中,包括Lisp,primefaces是可执行代码或数据的基本单位。
处理器可以同时读取一个位置并在同一总线操作中写入的操作。 这可以防止任何其他处理器或I / O设备在操作完成之前写入或读取内存。
primefaces意味着不可分割性和不可约性,所以primefaces操作必须完全执行或根本不执行。
刚刚find了一个primefaces与非primefaces操作后对我很有帮助。
“对共享内存进行操作的操作是相对于其他线程而言的一步完成的。
在共享内存上执行primefaces存储时,没有其他线程可以观察到修改半完成。
当对一个共享variables执行一个primefaces加载时,它会读取整个值,因为它在一个时刻出现。“
如果您有多个线程在下面的代码中执行方法m1和m2:
class SomeClass { private int i = 0; public void m1() { i = 5; } public int m2() { return i; } }
你有保证任何调用m2
线程将读取0或5。
另一方面,用这个代码( i
很长):
class SomeClass { private long i = 0; public void m1() { i = 1234567890L; } public long m2() { return i; } }
一个调用m2
的线程可能会读取0,1234567890L或其他一些随机值,因为语句i = 1234567890L
不能保证long
处于primefaces状态(JVM可以在两个操作中写入前32位和最后32位,而一个线程可能会观察到i
之间)。