在今天的工作中,我遇到了volatileJava中的关键字.我不太熟悉它,我发现了这个解释:
鉴于该文章解释了相关关键字的详细信息,您是否使用过它,或者您是否曾经看到过以正确方式使用此关键字的情况?
我想知道在声明变量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通过渲染循环读取并由按键事件设置?
可能类似的问题:
synchronized关键字添加到我的每个方法中.那没用.然后我将volatile关键字添加到每个字段.问题似乎只是解决了问题.
经过一些实验,我发现负责的领域是一个GameState跟踪我的游戏当前状态的对象,可以是正在播放也可以是忙碌.忙时,游戏会忽略用户输入.我所拥有的是一个不断更改state变量的线程,而Event线程读取state变量.但是,在一个线程更改变量后,另一个线程需要几秒钟来识别更改,这最终会导致问题.
它是通过制作状态变量来修复的volatile.
为什么volatile默认情况下不是Java中的变量,以及不使用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变量可能在一个线程上被改变,然后从另一个线程读取.
在多线程编程上经历许多资源时,通常会出现对volatile说明符的引用.很明显,使用此关键字并不是在C/C++和Java(版本1.4及更早版本)中实现多个线程之间同步的可靠方法.以下是维基百科列出(不解释如何)作为此说明符的典型用法: -
我可以开始在上面列出的用法中看到这个说明符的作用,但由于我还没有完全理解这些区域中的每一个,我无法弄清楚这个说明符在每个用法中的行为.
有人能解释一下吗
我更改了一个值,用于确定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 ×5
volatile ×5
actor ×1
c++ ×1
concurrency ×1
java-me ×1
keyword ×1
scala ×1
synchronized ×1