假设我们有这个//Thisistriviallyimmutable.publicclassFoo{privateStringbar;publicFoo(Stringbar){this.bar=bar;}publicStringgetBar(){returnbar;}}是什么让这个线程不安全?继此question. 最佳答案 Foo在安全发布后是线程安全的。例如,这个程序可以打印“不安全”(它可能不会使用热点/x86的组合)——如果你将bar设置为final,它就不会发生:publicclassUnsafePublication{st
我的问题很简单。我正在尝试制作一组java.net.URL,它们是publicstaticfinal,这样任何类都可以从任何上下文访问它们,因为这些URL获胜'在运行时改变。但是,当我尝试创建它们时,出现编译器错误,告诉我必须捕获或声明抛出的java.net.MalformedURLException,但在方法之外这是不可能的。有什么方法可以绕过这种抛出非java.langThrowable的构造函数吗?下面的一些虚拟代码可视化我的问题:publicclassMain{publicstaticfinaljava.net.URLSTATIC_URL=newjava.net.URL("
这个错误是什么意思..它在Eclipse中运行良好但在intellijidea中运行不正常Exceptioninthread"main"java.lang.VerifyError:Cannotinheritfromfinalclassatjava.lang.ClassLoader.defineClass1(NativeMethod)atjava.lang.ClassLoader.defineClassCond(ClassLoader.java:631)atjava.lang.ClassLoader.defineClass(ClassLoader.java:615)atjava.secu
您将如何指示弃用父类(superclass)的final方法?//ClassaoutofmycontrolclassA{publicfinalvoidfoo(){...}}classBextendsA{publicvoidfooAlternative(){...}//deprecatefoo?}背景:在扩展JavaFXAPI时,我们面临着几种final方法,使我们无法随心所欲地进行更改。有时这是必需的,我发现唯一合适的解决方案是创建一个附加方法。在这种情况下,弃用A提供的方法会很好地让程序员意识到存在不同的替代方法。包装对象不是一个可行的选择,因为多态性需要继承。
根据Java内存模型,一个final在对象的构造函数中初始化的字段不受进一步修改的影响,保证每个读取它的线程都能正确看到它的值,即使对象本身已经发布了数据竞争。JLS谈论17.5.3SubsequentModificationofFinalFields,并含糊地说Animplementationmayprovideawaytoexecuteablockofcodeinafinalfieldsafecontext.它似乎并没有真正定义这种修改的语义,也没有确切地定义这个final字段安全上下文东西必须存在的地方或如何定义它(即,JLS似乎没有给出对最终字段的后续修改的任何保证)。我必须说
背景:我注意到在许多项目中,几乎所有内部代码中的类都是公开的而不是最终的,即使它们不需要。然而,对我来说,不默认做出这个决定似乎是明智的,但只有当它们实际上是为了从系统的其他部分使用时才公开类。拥有包保护类是一种在模块之间强制执行边界的简单机制,并可作为类预期用途的文档。如果有一个(最好是免费的:-)工具来保护所有可以在不破坏程序的情况下被保护的类,并且可能使所有没有子类的东西成为最终的,那将是开始有意识地使用保护机制。(当然你需要事后调整。)你知道这样的工具吗?警告:我知道有更好的模块化机制,如OSGI和计划中的super包等。但在许多当前项目中,这不是一个选项,使用普通的旧Ja
这个问题在这里已经有了答案:DoesuseoffinalkeywordinJavaimprovetheperformance?(14个答案)关闭5年前。在最新的Java版本中,从性能/内存的角度来看,在方法内将变量声明为final是否有任何好处?我在这里不是在谈论任何其他好处。这个问题DoesuseoffinalkeywordinJavaimprovetheperformance?大约7年前就已解决,此后取得了一些进展。
在Java中,Object的wait()方法被实现为final方法的原因是什么?不需要覆盖wait()吗? 最佳答案 Java语言规范描述了同步的工作原理。在众多概念中,如对象监视器,还有WaitSets的概念。.Everyobject,inadditiontohavinganassociatedmonitor,hasanassociatedwaitset.Awaitsetisasetofthreads.Whenanobjectisfirstcreated,itswaitsetisempty.Elementaryactionstha
我知道您可以通过写入对final或volatile字段的引用来安全地发布一个非线程安全对象,该字段稍后将由另一个线程读取,前提是在发布时,创建对象的线程会丢弃对它的引用,这样它就不会再干扰或不安全地观察对象在其他线程中的使用。但是在这个例子中,没有显式的final字段,只有final局部变量。如果调用者放弃对unsafe的引用,这个发布是安全的吗?voidpublish(finalUnsafeunsafe){mExecutor.execute(newRunnable(){publicvoidrun(){//dosomethingwithunsafe}}}我找到了一些问答,比如thiso
Javamemorymodel保证对象的构造和终结器之间存在先行关系:Thereisahappens-beforeedgefromtheendofaconstructorofanobjecttothestartofafinalizer(§12.6)forthatobject.以及final字段的构造函数和初始化:Anobjectisconsideredtobecompletelyinitializedwhenitsconstructorfinishes.Athreadthatcanonlyseeareferencetoanobjectafterthatobjecthasbeencomp