草庐IT

Synchronized

全部标签

java - 同步块(synchronized block) - Java

我意识到Java中提供的同步块(synchronizedblock)基本上是一个可重入互斥量的实现。然而同步块(synchronizedblock)是原子的吗?那么如何为当前在同步块(synchronizedblock)中执行的线程处理中断-它是否只是通过恢复到目前为止所做的所有更改来释放锁?编辑:关于问题的中断部分——它在Java中通常是如何处理的。例如,我看到许多Java代码示例,其中开发人员在(比如说)线程处于等待队列中时捕获中断。然而,在catchblock中,它们所做的只是打印已引发中断。我更好奇那个线程到底发生了什么?是否从等待队列中移除? 最佳

java - Java 中是否有任何编译时机制来尝试确保特定类的使用始终同步?

目前我们的代码库中有一个类在方法级别使用synchronized关键字来确保多线程操作中的数据一致性。它看起来像这样:publicclassFoo{publicsynchronizedvoidabc(){...}publicsynchronizedvoiddef(){...}//etc.}这样做的好处是任何使用该类的人都可以免费获得同步。当您创建Foo的实例时,您不必记得在synchronizedblock或类似的任何内容中访问它。不幸的是,方法级别的同步似乎不再有效。相反,我们将不得不开始同步Foo本身。我认为java.util.concurrent.AtomicReference之

java - 如何中断 Java 中的同步语句?

我有两个线程想要在同一个对象上进行同步。TheadA需要能够在满足特定条件时中断ThreadB。这是两个线程做什么/应该做什么的一些伪代码。答:publicvoidrun(){while(true){//Dostuffsynchronized(shared){//Domorestuffif(condition){B.interrupt();}}}}乙:publicvoidrun(){while(true){try{//Dostuffsynchronized(shared){//Domorestuff}}catch(InterruptedExceptione){continue;}}}这

java - 为什么 EclEmma 不涵盖 syncronized(MyClass.class)?

我正在使用EclEmma进行覆盖率分析。我的Java代码包含一个synchronized(MyClass.class){}block。EclEmma说它只被部分覆盖,尽管我有一个单元测试,其中一个线程获得访问权限而另一个线程被阻止。是否可以使用EclEmma全面覆盖同步?我能否以某种方式注释代码以告诉EclEmma全面覆盖这一行?亲切的问候罗杰 最佳答案 我不确定是否有可能获得全面报道,因为issue2939804报告:EMMAalwaysmarkssynchronized(..)aspartiallycoveredExamples

java - 混合 volatile 和 synchronized 作为读写锁

考虑一个原始类型变量,有很多线程读取和一些线程写入,下面的代码能正常工作吗?如果会,它提供的性能是否优于1)。在所有方法上声明同步;2).使用显式ReadWriteLock?这是一个常见的模式吗?如果不是,这种情况通常使用什么模式?目前这对我来说效果很好,但我觉得同时使用volatile和synchronized有点多余。privatevolatileintvalue=1;publicvoidfunc1(){if(value==1){//dosomething}}publicvoidfunc2(){if(value==2){//dosomething}}publicvoidfunc3(

java - synchronized Collection 的 toArray() 方法是同步的吗?

如果我有一个这样的同步集合Collectionc=Collections.synchronizedCollection(myCollection);synchronizedCollection的javadoc提到外部迭代必须像这样同步:synchronized(c){Iteratori=c.iterator();while(i.hasNext()){process(i.next());}}我可以假设c.toArray()是同步的,因此当方法执行时集合不会发生变化吗?或者我是否也需要同步它:synchronized(c){c.toArray();} 最佳答案

java - 同步文件对象

据我所知和研究,Java中的synchronized关键字可以使方法或代码块语句同步以处理多线程访问。如果我想在多线程环境中锁定文件以用于写入目的,我必须应该使用JavaNIOpackage中的类以获得最好的结果。昨天,我想出了一个关于处理文件I/O操作的共享servlet的问题,BalusC注释对解决方案很有帮助,但是thisanswer中的代码让我困惑。我不是在要求社区“烧毁那个帖子”或“让我们对他投反对票”(注意:我没有对它投反对票或其他任何东西,我不反对这个答案),我要求解释代码片段是否可以被认为是一种好的做法privatestaticFiletheFile=newFile("

java - 任何人都可以解释如何在 java 中使用 Reentrant Lock over Synchronized 和一些最好的例子

当我在http://javarevisited.blogspot.in/2013/03/reentrantlock-example-in-java-synchronized-difference-vs-lock.html运行示例类时,我看到了与synchronized相同的行为。 最佳答案 这里有线程获取锁和释放锁的三种方式、方法。您可能想尝试使用synchronized关键字来实现这些。使用ReentrantLock的扩展功能和优势将变得显而易见。publicclassDoorLockUsingLock{privateintcou

java - 我可以同步覆盖的方法吗?

我正在重写父类(superclass)中的一个方法,但是我希望这个方法是同步的。允许吗?有什么替代方案? 最佳答案 是的,这是允许的,因为它不会改变契约(Contract),而是会改变实现。认为您总是可以简单地添加一个同步块(synchronizedblock):synchronized(this){就在方法的开头,这将实现大致相同的结果。该方法中还可能有其他(可能隐藏的)更深的锁,这使得它真正成为实现的一部分,而不是API。 关于java-我可以同步覆盖的方法吗?,我们在StackOv

java - synchronized方法修改后所有java线程都会看到共享资源更新吗?

如果对一对数据结构的所有访问总是包含在锁的获取和释放中(特别是,对数据结构的任何修改使用静态同步方法)。例如:publicstaticsynchronizedItemdoIt(){//removesomethingfromdatastructure1//addtheremoveditemtodatastructure2//returnremoveditem}我知道同步方法一次只会强制一个线程执行更新,但是当一个线程退出该方法时,是否保证其他线程可以看到更新的数据结构,或者我是否仍然需要专门的并发该保证的数据结构?编辑:这是我正在尝试做的一个更好的例子:privatestaticfina