并发和并行有什么区别?
赞赏的例子.
我对synchronized关键字的用法和重要性有一些疑问.
synchronized关键字有什么意义?synchronized?在今天的工作中,我遇到了volatileJava中的关键字.我不太熟悉它,我发现了这个解释:
鉴于该文章解释了相关关键字的详细信息,您是否使用过它,或者您是否曾经看到过以正确方式使用此关键字的情况?
我经常发现这些术语在并发编程的上下文中使用.它们是相同的还是不同的?
在Java Concurrency In Practice一书中,我们被告知可以通过编译器,JVM在运行时甚至由处理器重新排序程序的指令.因此,我们应该假设执行的程序不会以与我们在源代码中指定的顺序完全相同的顺序执行其指令.
但是,讨论Java内存模型的最后一章提供了一个先前发生的规则列表,指出了JVM保留了哪些指令排序.这些规则中的第一条是:
我相信"程序顺序"是指源代码.
我的问题:假设这个规则,我想知道什么指令可能实际重新排序.
"行动"定义如下:
Java内存模型是根据操作指定的,包括对变量的读取和写入,监视器的锁定和解锁,以及启动和连接线程.JMM定义了在程序中的所有操作之前调用的部分排序.为了保证执行动作B的线程可以看到动作A的结果(A和B是否出现在不同的线程中),必须在A和B之间的关系之前发生.在没有发生之前在两个之间进行排序操作,JVM可以随意重新排序.
其他提到的订单规则是:
我希望能够原子地增加一个计数器,我找不到任何关于如何做的参考.
根据评论添加更多信息:
我想做这样的事情:
class Counter {
private var mux Mutex
private (set) value Int
func increment (){
mux.lock()
value += 1
mux.unlock()
}
}
Run Code Online (Sandbox Code Playgroud) 在阅读有关内存一致性错误的Java文档时.我找到了与两个创造事件相关的点 - 在关系之前:
当一个语句调用时Thread.start(),与该语句有一个before-before关系的每个语句也与新线程执行的每个语句都有一个before-before关系.新线程可以看到导致创建新线程的代码的影响.
当一个线程终止并导致Thread.join()另一个线程返回时,终止
线程执行的所有语句
与成功连接后的所有语句都有一个before-before关系.现在,执行连接的线程可以看到线程中代码的效果.
我无法理解他们的意思.如果有人用一个简单的例子解释它会很棒.
读取和写入单个变量是原子的(语言保证!),除非变量的类型为long或double.
我正在读一个课程的幻灯片,我发现写了.这个类是关于并发的.
任何人都可以向我解释为什么写长或双不是原子操作?这让我感到惊讶.
concurrency ×6
java ×6
keyword ×2
collections ×1
data-race ×1
swift ×1
synchronized ×1
volatile ×1