没有发生的安全发布 - 之前?(Safe Publication without happens-before? Anyhow besides final?)
根据JCP(16.2.2。安全公告):
发生这种情况 - 在担保实际上比可靠的出版物更具有可见性和有序性的承诺之前。 当X从A安全地发布到B时,安全发布可保证X的状态可见性,但不保证其他变量A可能已触及的状态的可见性。 但是,如果将X放入队列中 - 在B从该队列中提取X之前,B不仅看到X处于A离开它的状态(假设X未被A或其他任何人修改),而且B看到所有A在切换前都做过了(同样需要注意)
我想知道什么时候安全发布可以没有发生 - 之前,即不使用volatile / atomics或同步(或通过框架,如使用任何列在里面的AQS)?
一种情况是不可变对象中的最终字段,您可以在其中发布它,而不需要执行任何其他步骤。
还有其他情况吗?
UPD:重读3.5.3。 安全出版惯用语,另一种情况 - “从静态初始化器初始化对象引用”。 现在看来这些都是选项。
According to JCP (16.2.2. Safe Publication):
This happens-before guarantee is actually a stronger promise of visibility and ordering than made by safe publication. When X is safely published from A to B, the safe publication guarantees visibility of the state of X, but not of the state of other variables A may have touched. But if A putting X on a queue happens-before B fetches X from that queue, not only does B see X in the state that A left it (assuming that X has not been subsequently modified by A or anyone else), but B sees everything A did before the handoff (again, subject to the same caveat)
I'm wondering when safe publication can be without happens-before, i.e. w/o using volatile/atomics or synchronization (or via frameworks such as AQS which use any of listed inside)?
One case is final fields in immutable object, where you can publish it as is w/o any additional steps.
Are there any other cases?
UPD: re-read 3.5.3. Safe Publication Idioms, another case - "Initializing an object reference from a static initializer". Seems now these are all options.
原文:https://stackoverflow.com/questions/5458848
最满意答案
相关问答
更多-
使用动态缓冲区?(Using Dynamic Buffers? Java)[2023-10-20]
java.io.ByteArrayOutputStream是一个字节数组的封装,并根据需要进行扩展。 也许这是你可以使用的东西。 编辑: 重用只需调用reset()并重新开始... java.io.ByteArrayOutputStream is a wrapper around a byte-array and enlarges it as needed. Perhaps this is something you could use. Edit: To reuse just call reset() a ... -
虚拟机是否允许在最终释放缓冲区之前重新定位缓冲区? 它不会重定位它,因为直接缓冲区不是GC堆的一部分。 如果我使用NewDirectByteBuffer在本机代码中创建一个新缓冲区,它的责任是释放后备内存吗? 这是你的(本地代码)责任来释放它。 JVM不知道用什么方法分配后备存储(可能是malloc'd,可能是静态缓存等) 如果我使用NewDirectByteBuffer在本机代码中创建一个新缓冲区,并且一个已被直接缓冲区使用的地址,会发生什么? 考虑到VM不会尝试释放其地址传递给NewDirectByte ...
-
实际上,这可以通过翻译矩阵来完成。 如果没有看到您正在讨论的教程,很难猜测它们使用动态顶点缓冲区的基本原理,它可能纯粹是教学法。 Indeed, this can be done with a translation matrix. Without seeing the tutorial you're talking about, it's difficult to guess their rationale for using a dynamic vertex buffer, it could be pu ...
-
协议缓冲区要提交?(Protocol Buffers to file?)[2022-07-19]
我不确定你为什么要创建DataOutputStream并首先调用dos.write ... 我通常会用这个: profile.build().writeTo(output); 但是,我仍然希望文件真的是二进制文件。 当然,它将包括文本“123”和“John”,因为那些只是UTF-8字符串......但是那里也应该有非文本。 你确定它只是文字吗? 你可以发布输出吗? I'm not sure why you're creating the DataOutputStream and calling dos.w ... -
在java图形中使用缓冲区(use of buffers in java graphics)[2022-07-04]
您当前的循环可能会占用Swing E vent D ispatch T hread或EDT ,从而有效地冻结您的应用程序,因为所有重要的线程都无法执行必要的操作 - 呈现您的应用程序并响应用户输入。 您需要通过确保循环在后台线程中运行来考虑线程。 话虽如此,我必须质疑教程的质量,及时性和相关性,如果它建议您使用Canvas等AWT组件进行编码,并且建议您使用null布局和组件的绝对定位(即使用setBounds(...) )。 根据教程,使用所有Swing组件和Swing图形会好得多。 请看看: 基本的Sw ... -
protobuf数据中的根对象不是自终止的; 它被设计为可附加的(附加=== merge),所以通常库只是读取,直到它用完数据。 如果你有备用零,它将无法解析下一个字段标题。 有两种方法可以解决这个问题: 如果您只想发送一条消息,只需关闭消息末尾的出站套接字即可; 客户端应该检测套接字的结束并相应地进行补偿(注意,除非使用长度受限的流包装器,否则您仍然不想使用超大缓冲区) 使用某种“框架”协议; 最简单的方法是简单地在每条消息前面加上该消息中的字节数(请注意,在一般情况下,这个大小不是固定的,但在3个双倍的 ...
-
free不了解您的数据结构。 你传递了一个以前用malloc (或calloc或realloc )分配的内存块,它释放了那块内存而没有别的东西。 因此,为了避免泄漏内存,您必须拥有与malloc一样多的free调用。 有两个原因: 在C中,堆上管理的内存(使用malloc和free )在很大程度上被视为黑盒子。 该语言中没有允许库函数知道您存储在内存中的内容的机制,因此free不能为您遍历数组。 自动遍历数据结构为您做出策略决策:数据结构的组件被视为一个整体,应作为一个整体释放。 一般来说,情况并非如此,C ...
-
这将取决于设备/驱动程序/浏览器。 没有一般的答案。 一个设备或驱动程序对于缓冲区可能更快,另一个设备或驱 还有实际的访问权限。 缓冲区没有随机访问,纹理可以。 如果您需要随机访问,您唯一的选择是纹理。 驱动程序优化的一个示例是,如果替换整个缓冲区或纹理,驱动程序可以在内部创建新的缓冲区或纹理,然后在适当时开始使用它。 如果它没有这样做,你更新当前正在使用的缓冲区或纹理,就像已经发出命令使用缓冲区或纹理绘制一些东西但这些命令尚未执行,那么驱动程序将不得不停止程序,等待缓冲区或纹理使用,然后可以用新内容替换它 ...
-
与Protobuf-C ++“反射”界面等效的Java就是com.google.protobuf.Message界面。 所有消息对象都实现了这一点,它有像getField()这样的方法,可以按描述符读取任意字段。 同样,所有构建器都实现了具有setField()等功能的Message.Builder 。 与C ++不同,此功能不会委托给单独的对象。 The Java equivalent to the Protobuf-C++ "reflection" interface is simply the com ...
-
java协议缓冲区 - 使用扩展字段构造子消息(java protocol buffers - construct sub message with extension field)[2022-06-04]
继jonathons回答之后,这里是在java中创建和访问扩展的示例 Protobuf定义: message Message { extensions 100 to max; required uint64 A = 1; } message Event { extend Message { required Event ext = 101; optional string name = 102; } extensions 10 ...