草庐IT

non-volatile

全部标签

java - volatile 和 synchronized 在一起

是否有任何理由在此代码中同时使用volatile和synchronized?publicclassHelper{privatevolatileintn;privatefinalObjectlock=newObject();publicHelper(intn){this.n=n;}publicvoidsetN(intvalue){synchronized(lock){n=value;}}}类助手必须是线程安全的。我从《JavaConcurrencyGuidelines》一书中得到了这个例子,但还是不清楚:这个例子中为什么要同时使用volatile和synchronized?

java - volatile 实际上是如何工作的?

在Java中将变量标记为volatile可确保每个线程看到的是最后写入的值,而不是一些陈旧的值。我想知道这实际上是如何实现的。JVM是否发出特殊指令来刷新CPU现金或其他东西? 最佳答案 据我所知,它总是看起来好像缓存在写入后已被刷新,并且总是看起来好像在读取时直接从内存中进行读取。结果是一个线程将始终看到来自另一个线程的写入结果,并且(根据Java内存模型)永远不会看到缓存值。然而,实际实现和CPU指令会因架构而异。如果您在多个线程中增加变量,或者检查它的值并采取一些行动,则不能保证正确性,因为显然没有实际的同步。如果只有线程写入

Java volatile 变量问题

阅读此DZonearticle关于Java并发我想知道是否有以下代码:privatevolatileListlist;privatefinalLocklock=newReentrantLock();publicvoidupdate(ListnewList){ImmutableListl=newImmutableList().addAll(newList);lock.lock();list=l;lock.unlock();}publicListget(){returnlist;}相当于:privatevolatileListlist;publicvoidupdate(ListnewLis

java - volatile 变量是否需要同步访问?

我在理解Java中的volatile变量时遇到一点困难。我有一个参数化类,其中包含一个volatile变量,如下所示:publicclassMyClass{privatevolatileTlastValue;//...othercode...}我必须针对lastValue实现某些基本操作,包括get-value-if-not-null。这些操作需要同步吗?我可以通过以下方法逃脱吗?publicvoiddoSomething(){StringsomeString;...if(lastValue!=null){someString+=lastValue.toString();}}或者我是否

java - 在没有同步的情况下使用 volatile

知道Readsandwritesareatomicforallvariablesdeclaredvolatile问题1:这个是不是可以这样理解privatevolatileintx=0;x++;操作是原子的?还有那个Markingvariablevolatiledoesnoteliminateallneedtosynchronizeatomicactions,becausememoryconsistencyerrorsarestillpossible.问题2:我想知道在什么情况下(如果有的话)可能会看到标记为volatile的变量而看不到标记为同步的block的任何方法(试图访问/修改

Java 线程 : Should all shared variables be Volatile ?

这个问题在这里已经有了答案:Javavolatilemodifierandsynchronizedblocks(3个答案)关闭5年前。我想了解多线程在Java中是如何工作的。我了解Volatile和Synchronization之间的区别。Volatile与可见性有关,不保证同步。当我们使用多线程环境时,每个线程都会在它们正在处理的变量的本地缓存中创建自己的副本。更新此值时,更新首先发生在本地缓存副本中,而不是实际变量中。因此,其他线程不知道其他线程正在更改的值。这就是volatile发挥作用的地方。volatile字段会立即写入主内存,并从主内存进行读取。摘自ThinkingInJa

【开发日记】Uncaught (in promise) SyntaxError: Unexpected non-whitespace character after JSON at position

【问题】JavaScript使用JSON.parse(data)解析字符串时报错以下内容:Uncaught(inpromise)SyntaxError:Unexpectednon-whitespacecharacterafterJSONatposition21(line1column22)atJSON.parse()ateval(main.js:84:1)我这里出现该报错是因为后端传递到前端的数据是经过AES加密的,前端需要先对数据进行解密后再用JSON.parse(data)API解析解密后的字符串,但控制台打印的JSON字符串是没有问题的,上面的报错信息报的就是下面这个JSON字符串问题:

java - 如果 main 方法在 java 文件的 "non public class"中怎么办?

我有一个包含多个类的java文件,其中一个是公共(public)类。如果main方法在非公共(public)类中。我无法运行该java文件。这是为什么?而且也没有编译错误。如果是这样,我该如何使用该主要方法? 最佳答案 实际上你可以在非公共(public)类中执行main方法。如果你把这个类classA{publicstaticvoidmain(String...args){System.out.println("Thisisnotapublicclass!");}}在名为NonPubClass.java的文件中。您可以使用java

java - 为什么我们不需要带有 StampedLock 的 volatile?

给定来自Oracle文档的代码示例https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/StampedLock.htmlclassPoint{privatedoublex,y;privatefinalStampedLocksl=newStampedLock();voidmove(doubledeltaX,doubledeltaY){//anexclusivelylockedmethodlongstamp=sl.writeLock();try{x+=deltaX;y+=deltaY;}finally{sl

java - Java 中多次写入对 volatile 变量的影响

我在这个网站上发现了一些有趣的问题(例如,thisone)关于Java中volatile变量的可见性影响,这些问题源自本书JavaconcurrencyinPractice中的这段话:Thevisibilityeffectsofvolatilevariablesextendbeyondthevalueofthevolatilevariableitself.WhenthreadAwritestoavolatilevariableandsubsequentlythreadBreadsthatsamevariable,thevaluesofallvariablesthatwerevisibl