年复一年,我试图了解部分与内存模型和并发交易的Java规范。我不得不承认我失败了。是的,我了解锁和“同步”,wait()和notify()。我可以很好地使用它们,谢谢。对于“
volatile”的作用,我什至不清楚。但是所有这些都不是来自html" target="_blank">语言规范,而是来自一般经验。
这是我要问的两个示例问题。我对特定答案不太感兴趣,因为我需要了解答案是如何从规范中得出的(或者可能是我得出结论,规范没有答案)。
一句话警告:如果这里 有 答案,请指望其中有很多是错误的。我不打算发布详细信息的原因之一是,因为我很确定至少在某些方面 会
犯错。我的意思是,当我说每个认为自己可以回答这个问题的人实际上有足够的严谨性来解决这个问题时,对社区没有任何不尊重。(Joe
Duffy最近发现了一些让.NET内存模型感到惊讶的东西。如果他能弄错的话,像我们这样的凡人也可以。)
我将仅从一个方面提供一些见解,因为它常常被误解:
波动性和原子性之间是有区别的。人们通常认为原子写入是易失性的(即,如果写入是原子的,则无需担心内存模型)。这不是真的。
易变性是关于一个线程(在源代码中,从逻辑上来说)执行读取是否会“看到”另一线程所做的更改。
原子是关于是否有任何机会,如果一个变化 是 看到的,只有变化的部分可以看出。
例如,写入一个整数字段。保证是原子的,但不是易变的。这意味着如果有(从foo.x = 0开始):
Thread 1: foo.x = 257;
Thread 2: int y = foo.x;
可能y
是0或257。由于原子性约束,不会是其他任何值(例如256或1)。但是,即使您知道在“挂墙时间”中在线程1中的代码之后执行的线程2中的代码,也可能存在奇数缓存,内存访问了“移动”等。使变量为x
volatile将解决此问题。
我将剩下的工作交给真正的诚实至善专家。
问题内容: 我看到的唯一的void返回类型在方法中具有System.out.println语句。因此,一旦调用该方法,这些字符串就会被打印出来。 您是否可以使返回类型为字符串并让该字符串返回而不是执行void返回类型? 如果void返回类型方法中包含其他方法,您能否将返回类型设为该方法给出的值,该值将返回该方法的结果? 什么时候只能使用void返回类型? 问题答案: 有人可以解释Java中的voi
问题内容: 当我将字符串值1和7存储到“ mykey”中时, redis中到底存储了 什么?以及getbit在redis中如何工作? 有人试图在该值内循环位吗? 我知道bitcount会给我2,但我也想从中获得确切的字符串值1和7,这可能吗? -- 我通过使用erlang redis客户端读取输出进行了一些实验。 erlang输出: 然后删除此条目: 我做同样的事情来偏移2 4 8,在这里您可以看
问题内容: 越来越多地使用Python,并且不断看到在不同文件中设置的变量。有人可以解释这是什么吗? 问题答案: 这是该模块的公共对象的列表,由解释import 。它覆盖了默认的内容,即隐藏以下划线开头的所有内容。
问题内容: 我只是在android上开始,而我的java很生锈。我不记得曾经见过像这样嵌套在另一个函数中的函数。有人可以向我确切解释final的作用,并解释为什么您要在另一个函数中嵌套这样的功能吗? 问题答案: 这是一个匿名类。实际发生的情况是正在使用重写的函数创建 的子类。 关于匿名类的最优雅的事情之一是,它们使您可以在需要的地方准确定义单发类。此外,匿名类具有简洁的语法,可减少代码中的混乱情况
问题内容: 情况1:这不会引起?。谁能告诉我为什么这不会导致ConcurrentModificationException。 情况2:这是由于我尝试访问AsyncThread中的线程不安全的人员列表。我可以使我的“人员列表”实现是线程安全的,并且应该可以运行。 谁能解释我到底发生了什么。我无法理解这是如何解决问题的。 案例2是否将实现从更改为推荐? 添加例外: 05-28 20:34:21.073
问题内容: 好的,所以我试图制作一个可以处理.wav文件的程序,并且已经看到了这个问题/答案,但是我不确定是标题中的每个数据指的是什么。例如,“块”指的是什么?那是特定数量的位/字节吗? 如果有人能至少以本问题中使用的格式告诉我,除常量String Literals和’data’数组外,每个引用到.wav的数据是什么?特别是,我特别想知道什么是“块”,以及所有通道的采样率,字节率,每个采样的字节和