相关疑难解决方法(0)

你在Java中使用volatile关键字吗?

在今天的工作中,我遇到了volatileJava中的关键字.我不太熟悉它,我发现了这个解释:

Java理论与实践:管理波动性

鉴于该文章解释了相关关键字的详细信息,您是否使用过它,或者您是否曾经看到过以正确方式使用此关键字的情况?

java multithreading volatile keyword

628
推荐指数
13
解决办法
24万
查看次数

Java中volatile和synchronized之间的区别

我想知道在声明变量as volatile和始终访问synchronized(this)Java 中的块中的变量之间的区别?

根据这篇文章,http://www.javamex.com/tutorials/synchronization_volatile.shtml有很多要说的,但也有很多不同之处,但也有一些相似之处.

我对这条信息特别感兴趣:

...

  • 对volatile变量的访问永远不会阻塞:我们只进行简单的读或写操作,因此与synchronized块不同,我们永远不会持有任何锁;
  • 因为访问volatile变量永远不会持有锁,所以它不适合我们想要读取update-write作为原子操作的情况(除非我们准备"错过更新");

read-update-write是什么意思?写入也不是更新,还是仅仅意味着更新是依赖于读取的写入?

最重要的是,何时更适合声明变量volatile而不是通过synchronized块访问变量?使用volatile依赖于输入的变量是一个好主意吗?例如,有一个变量被称为render通过渲染循环读取并由按键事件设置?

java multithreading volatile synchronized java-me

222
推荐指数
4
解决办法
9万
查看次数

为什么Java中的变量不是默认的volatile?

可能类似的问题:

你在Java中使用volatile关键字吗?


今天我正在调试我的游戏; 它有一个非常困难的线程问题,每隔几分钟就出现一次,但很难重现.所以首先我将synchronized关键字添加到我的每个方法中.那没用.然后我将volatile关键字添加到每个字段.问题似乎只是解决了问题.

经过一些实验,我发现负责的领域是一个GameState跟踪我的游戏当前状态的对象,可以是正在播放也可以是忙碌.忙时,游戏会忽略用户输入.我所拥有的是一个不断更改state变量的线程,而Event线程读取state变量.但是,在一个线程更改变量后,另一个线程需要几秒钟来识别更改,这最终会导致问题.

它是通过制作状态变量来修复的volatile.

为什么volatile默认情况下不是Java中的变量,以及不使用volatile关键字的原因是什么?

java multithreading volatile

12
推荐指数
5
解决办法
5482
查看次数

我的Scala actor的属性应该标记为@volatile吗?

在Scala中,如果我有一个简单的类,如下所示:

val calc = actor {
  var sum = 0
  loop {
    react {
      case Add(n) => 
        sum += n
      case RequestSum =>
        sender ! sum
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的领域sum应该被标记@volatile吗?虽然actor在逻辑上单线程的(即消息是按顺序处理的),但各个反应可能发生在不同的线程上,因此state变量可能在一个线程上被改变,然后从另一个线程读取.

scala volatile thread-safety actor

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

在C/C++/Java中使用volatile说明符

在多线程编程上经历许多资源时,通常会出现对volatile说明符的引用.很明显,使用此关键字并不是在C/C++和Java(版本1.4及更早版本)中实现多个线程之间同步的可靠方法.以下是维基百科列出(不解释如何)作为此说明符的典型用法: -

  1. 允许访问内存映射设备
  2. 允许在setjmp和longjmp之间使用变量
  3. 允许在信号处理程序中使用变量
  4. 忙着等待

我可以开始在上面列出的用法中看到这个说明符的作用,但由于我还没有完全理解这些区域中的每一个,我无法弄清楚这个说明符在每个用法中的行为.

有人能解释一下吗

c++ java volatile

5
推荐指数
2
解决办法
4250
查看次数

Java中的奇怪行为,在多线程程序中使用非同步访问

我更改了一个值,用于确定while循环何时在单独的线程中终止.
我不想知道如何使这个工作.如果我只通过synchronized getters/setters访问变量测试,它按预期工作.

我原以为,如果一些读/写命令由于并发而丢失,程序有时不会终止,但它永远不会.这让我感到困惑..
我想知道为什么程序永远不会终止,没有print-command.我想了解为什么print-command会改变任何东西..

     

    public class CustomComboBoxDemo  {
        public static boolean test = true;
        public static void main(String[] args) {
            Thread user =new Thread(){
                @Override
                public void run(){
                    try {
                        sleep(2000);
                    } catch (InterruptedException e) {}
                    test=false;
                }
            };
            user.start();
            while(test) {
                System.out.println("foo"); //Without this line the program does not terminate..
            }
        }
    }

Run Code Online (Sandbox Code Playgroud)

java concurrency

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