我读到了下面的某个地方.
Java volatile关键字并不意味着原子,它常见的误解是,在声明volatile之后,
++操作将是原子的,要使操作原子化,你仍然需要确保使用synchronizedJava中的方法或块进行独占访问 .
那么如果两个线程同时攻击一个volatile原始变量会发生什么呢?
这是否意味着,凡发生在它的锁,将要设置其值.如果在此期间,一些其他的线程来和读取旧值,而第一个线程正在改变它的价值,那么没有新的线程将读取其旧的价值?
Atomic和volatile关键字有什么区别?
Java中的原始数据类型是int&shortthread-safe吗?我已执行以下代码,有时无法看到预期的结果500.
public class SampleThree extends Thread
{
static long wakeUpTime = System.currentTimeMillis() + (1000*20);
static int inT;
public static void main(String args[])
{
System.out.println("initial:" + inT);
for(int i=0; i<500; i++)
new SampleThree().start();
try {
Thread.sleep(wakeUpTime - System.currentTimeMillis() + (1000*30));
System.out.println("o/p:" + inT);
}
catch(Exception e){
e.printStackTrace();
}
}
public void run()
{
try {
long s = wakeUpTime - System.currentTimeMillis();
System.out.println("will sleep ms: " + s);
Thread.sleep(s);
inT++; // System.out.println(inT);
}
catch(Exception e) {
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud) 年复一年,我试图了解部分与内存模型和并发交易的Java规范.我不得不承认我惨遭失败.是的'我理解锁和"synchronized"以及wait()和notify().我可以使用它们,谢谢.我甚至对"易变"的含义有一个模糊的想法.但所有这些都不是来自语言规范 - 而是来自一般经验.
以下是我要问的两个示例问题.我对特定答案并不是那么感兴趣,因为我需要理解答案是如何从规范中得出的(或者可能是我如何得出规范没有答案).
前几天,Howard Lewis Ship发布了一篇名为"我在Hacker Bed and Breakfast学到的东西"的博客文章,其中一个要点是:
通过延迟初始化只分配一次的Java实例字段不必同步或易失(只要您可以跨线程接受竞争条件以分配给字段); 这是来自Rich Hickey
从表面上看,这似乎与关于线程内存变化可见性的公认智慧不一致,如果在Java Concurrency in Practice一书或Java语言规范中有所涉及,那么我就错过了它.但这是HLS在Brian Goetz出席的活动中从Rich Hickey那里获得的东西,所以看起来肯定会有一些东西.有人可以解释一下这句话背后的逻辑吗?
在JLS的第17章中,它引入了一个概念:发生在一致之前.
如果对于A中的所有读取r,其中W(r)是r看到的写入动作,那么一组动作A发生 - 在一致之前,不是hb(r,W(r))或那里的情况在A中存在写w,使得wv = rv和hb(W(r),w)和hb(w,r)"
在我的理解中,它等于以下几个词:...,既不是......也不是......
所以我的前两个问题是:
它还给出了一个例子:17.4.5-1
Thread 1 Thread 2
B = 1; A = 2;
r2 = A; r1 = B;
Run Code Online (Sandbox Code Playgroud)
在第一个执行顺序中:
1: B = 1;
3: A = 2;
2: r2 = A; // sees initial write of 0
4: r1 = B; // sees initial write of 0
Run Code Online (Sandbox Code Playgroud)
订单本身已经告诉我们两个线程交替执行,所以我的第三个问题是:左数是什么意思?
在我的理解中,r2和r1的原因可以看出0的初始写入是A和B都不是volatile字段.所以我的第四个问题是:我的理解是否正确?
在第二个执行顺序中:
1: r2 = A; // sees write of A = 2
3: r1 = B; // sees …Run Code Online (Sandbox Code Playgroud) long并且double读取和写入操作不是原子的,因为它们的大小超过了cpu字大小.
那么long,double如果我有64位机器,我可以获得原子读写操作吗?