相关疑难解决方法(0)

挥发性Vs原子

我读到了下面的某个地方.

Java volatile关键字并不意味着原子,它常见的误解是,在声明volatile之后,++操作将是原子的,要使操作原子化,你仍然需要确保使用synchronizedJava中的方法或块进行独占访问 .

那么如果两个线程同时攻击一个volatile原始变量会发生什么呢?

这是否意味着,凡发生在它的锁,将要设置其值.如果在此期间,一些其他的线程来和读取旧值,而第一个线程正在改变它的价值,那么没有新的线程将读取其旧的价值?

Atomic和volatile关键字有什么区别?

java volatile

105
推荐指数
6
解决办法
9万
查看次数

79
推荐指数
2
解决办法
2万
查看次数

原始数据类型在Java中是否是线程安全的

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 primitive thread-safety

34
推荐指数
2
解决办法
3万
查看次数

Java内存模型 - 有人可以解释一下吗?

年复一年,我试图了解部分与内存模型和并发交易的Java规范.我不得不承认我惨遭失败.是的'我理解锁和"synchronized"以及wait()和notify().我可以使用它们,谢谢.我甚至对"易变"的含义有一个模糊的想法.但所有这些都不是来自语言规范 - 而是来自一般经验.

以下是我要问的两个示例问题.我对特定答案并不是那么感兴趣,因为我需要理解答案是如何从规范中得出的(或者可能是我如何得出规范没有答案).

  • "挥发性"究竟做了什么?
  • 写入变量原子?它取决于变量的类型吗?

java concurrency

28
推荐指数
3
解决办法
4136
查看次数

没有同步或volatile关键字的延迟初始化

前几天,Howard Lewis Ship发布了一篇名为"我在Hacker Bed and Breakfast学到的东西"的博客文章,其中一个要点是:

通过延迟初始化只分配一次的Java实例字段不必同步或易失(只要您可以跨线程接受竞争条件以分配给字段); 这是来自Rich Hickey

从表面上看,这似乎与关于线程内存变化可见性的公认智慧不一致,如果在Java Concurrency in Practice一书或Java语言规范中有所涉及,那么我就错过了它.但这是HLS在Brian Goetz出席的活动中从Rich Hickey那里获得的东西,所以看起来肯定会有一些东西.有人可以解释一下这句话背后的逻辑吗?

java concurrency multithreading

14
推荐指数
3
解决办法
1770
查看次数

如何理解发生 - 在一致之前

JLS的第17章中,它引入了一个概念:发生在一致之前.

如果对于A中的所有读取r,其中W(r)是r看到的写入动作,那么一组动作A发生 - 在一致之前,不是hb(r,W(r))或那里的情况在A中存在写w,使得wv = rv和hb(W(r),w)和hb(w,r)"

在我的理解中,它等于以下几个词:...,既不是......也不是......

所以我的前两个问题是:

  • 我的理解对吗?
  • "wv = rv"是什么意思?

它还给出了一个例子: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)

java memory-model

11
推荐指数
2
解决办法
4350
查看次数

原子读写long和double值

long并且double读取和写入操作不是原子的,因为它们的大小超过了cpu字大小.

那么long,double如果我有64位机器,我可以获得原子读写操作吗?

java multithreading atomicity

7
推荐指数
1
解决办法
1332
查看次数