相关疑难解决方法(0)

您在Java中遇到的最常见的并发问题是什么?

这是对Java中常见并发问题的一种调查.一个例子可能是经典的死锁或竞争条件,或者可能是Swing中的EDT线程错误.我对各种可能的问题既感兴趣,也对最常见的问题感兴趣.因此,请在每条评论中留下Java并发错误的一个特定答案,如果您看到自己遇到的错误,请立即投票.

java concurrency multithreading

190
推荐指数
28
解决办法
7万
查看次数

Java:从最终字段可到达的对象的最终字段冻结

标题为" Core Java Concurrency "的DZone refcard 声明:

设置后,无法更改最终字段值.将对象引用字段标记为final不会阻止从该字段引用的对象稍后更改.例如,最终的ArrayList字段不能更改为不同的ArrayList,但可以在列表实例上添加或删除对象.

最终字段冻结不仅包括对象中的最终字段,还包括从这些最终字段可到达的所有对象.

我对第二个陈述并不完全清楚.这是否意味着如果我在A类类型的A类中有一个final字段,而后者又有一个Integer类型的最终字段,那么A类实例的最终字段冻结只有在最后一个字段冻结b.c已经发生之后才会完成?

public class A{

  public final B b = new B();

}

public class B{ 

  public final Integer c = 10;

}
Run Code Online (Sandbox Code Playgroud)

java concurrency

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

Java内存模型中本地最终变量的语义?

以下代码有时会在我的Windows-PC和Mac上打印"valueWrapper.isZero()",它们都在服务器模式下运行它们的JVM.确定发生这种情况是因为值字段在ValueWrapper类中不是最终的,因此某些线程可能会看到过时值0.

public class ConcurrencyApp {
    private final Random rand = new Random(System.currentTimeMillis());
    private ValueWrapper valueWrapper;

    private static class ValueWrapper {
       private int value;

        public ValueWrapper(int value) {
            this.value = value;
        }

        public boolean isZero() {
            return value == 0;
        }
    }

    private void go() {
        while (true) {
            valueWrapper = new ValueWrapper(randomInt(10, 1024));
            Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    if (valueWrapper.isZero()) {
                        System.out.println("valueWrapper.isZero()");
                    }
                }
            });
            thread.start();
        }
    }

    private int randomInt(int min, int …
Run Code Online (Sandbox Code Playgroud)

java concurrency final

6
推荐指数
2
解决办法
268
查看次数

初始化对象的Java线程安全性

考虑以下课程:

public class MyClass
{
    private MyObject obj;

    public MyClass()
    {
        obj = new MyObject();
    }

    public void methodCalledByOtherThreads()
    {
        obj.doStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

由于obj是在一个线程上创建并从另一个线程访问的,因此当调用methodCalledByOtherThread时,obj可能为null吗?如果是这样,将obj声明为volatile是解决此问题的最佳方法吗?声明obj作为最终会有什么不同吗?

编辑:为清楚起见,我认为我的主要问题是:其他线程是否可以看到obj已经被某个主线程初始化或者obj可能是陈旧的(null)?

java concurrency thread-safety

2
推荐指数
1
解决办法
1100
查看次数

为什么Java变量不经常被声明为`final`?比较swift中的let关键字

在swift中,let如果变量在初始化后没有改变,建议用关键字声明变量.我看到很多变量被声明为let.

在java中,我认为关键字final可以起到同样的作用.但是根据我有限的经验,我只看到人们final在极少数情况下声明变量,例如PI.

为什么Java变量不final经常被声明?有什么我想念的吗?

java variables final let swift

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