草庐IT

synchronization

全部标签

java - 如何在没有同步块(synchronized block)(即低成本锁)的情况下在一个安全操作中原子地检查 Java 中的两个 AtomicBooleans?

所以我有两个AtomicBoolean,我需要检查它们。类似的东西:if(atomicBoolean1.get()==true&&atomicBoolean2.get()==false){//...}但两者之间存在竞争条件:(有没有办法将两个原子boolean检查组合成一个而不使用同步(即同步块(synchronizedblock))? 最佳答案 好吧,我可以想到几种方法,但这取决于您需要的功能。一种方法是“作弊”并使用AtomicMarkableReference:finalAtomicMarkableReferencetwoBo

java - 多线程修改StringBuilder

我问的问题与DifferencebetweenStringBuilderandStringBuffer有关但不一样。我想看看如果StringBuilder同时被两个线程修改会发生什么。我编写了以下类:publicclassThreadTester{publicstaticvoidmain(String[]args)throwsInterruptedException{RunnablethreadJob=newMyRunnable();ThreadmyThread=newThread(threadJob);myThread.start();for(inti=0;i最初我在StringCo

java - 同步成本

在高度并发的Java程序中,假设我的方法编写正确且同步正确,我想知道如何确定哪个更好:voidsynchronizedsomething(){...}或voidsomething(){synchronized(this){...}//heredostuffnorequiringsynchronization..//docomputation'A'.synchronized(this){...}//heredootherstuffnorequiringsynchronization..//docomputation'B'.synchronized(this){...}}现在我意识到,如果

java - 为什么在 Java 中从实例方法写入静态字段不好?

我在SO找到了一个帖子讨论防止从实例方法写入静态字段所需的代码更改,但为什么这样做不是一个好习惯?为什么Java设计者允许这样做?换句话说,为什么当有人试图这样做时编译器不抛出错误? 最佳答案 用“findbugz”文档的话来说:Thisinstancemethodwritestoastaticfield.Thisistrickytogetcorrectifmultipleinstancesarebeingmanipulated,andgenerallybadpractice.也就是说它并不总是错误的,只是它经常是错误的来源。实例对

java - 同步块(synchronized block)中的更改何时对其他线程可见

假设我在同步方法中更新了两个变量的值。在退出同步块(synchronizedblock)之前是否有可能在同步方法中设置的新值对其他线程可见?publicsynchronizedvoidsetValues(){a=5;//assumethreadispreemptedafterthisassignment//wouldthevalue5bevisibletootherthreads?//myunderstandingisthatthevalueswillnotbeflushedto//mainmemoryuntilthelockisreleased-i.e.,untilthesynchr

java - 字段读取同步和volatile的区别

在一个不错的articlewithsomeconcurrencytips,一个示例被优化为以下几行:doublegetBalance(){Accountacct=verify(name,password);synchronized(acct){returnacct.balance;}}如果我理解正确,同步的目的是确保此线程读取的acct.balance值是当前值,并且还写入了对acct.balance中对象字段的任何未决写入到主存储器。这个例子让我思考了一下:将acct.balance(即类Account的字段余额)声明为volatile不是更高效吗?它应该更有效,为您保存所有访问ac

java - Java 中的死锁 : When they occur?

我正在为J2ME开发一个应用程序,有时它完全卡住并且AMS需要相当长的时间来关闭它.在我看来,这像是一个死锁问题。你能告诉我什么会导致死锁吗?例如,如果对象调用其自身的另一个同步方法,调用对象的同步方法是否会导致死锁?谢谢!更新我说死锁应该发生在以下情况中是否正确:对象P调用对象A的同步方法,A调用对象B的同步方法,B调用对象的同步方法A对不起,如果我看起来很愚蠢,很可能是这样。但是这就是我问的原因。谢谢! 最佳答案 Would,forinstance,callingasynchronizedmethodofaobjectcause

java - AtomicReference 和 Synchronized 之间有什么区别?

AtomicReference和Synchronized有区别吗?例如publicclassInternet{AtomicReferenceaddress;publicStringgetAddress(){returnaddress.toString();}publicvoidsetAddress(Stringaddress){this.address.set(address);}}然后我将这个类传递给一些同时尝试使用这个类的线程,如果我使用这个是不是一样的:publicclassInternet{Stringaddress;publicStringgetAddress(){retur

java - Java 的同步会更新整个缓存,还是只更新我同步的对象?

如果我在同步方法或同步块(synchronizedblock)中访问一个对象,该访问元素中的所有对象是否也同步?假设有一个对象Queue具有同步的add()和take()方法,接受并分发复杂对象事物。Thing有很多列表,其中包含其他不同的对象。现在图像线程Before创建Thing并将一些现有对象放入Thing中,修改其中一些对象等等。Before线程将Thing添加到Queue。稍后线程After从Queue中获取Thing。问题:Thing及其所有子对象/子对象是否会处于与Before相同的状态?即使线程After可能更早地处理这些子元素之一?因为我对线程After的处理器进行成

java - "synchronized(this)"与 Java 中的 "synchronized((BaseClass)this)"?

这是我之前问题的后续问题,Isthisvariablebeingsafelyaccessedbyusingsynchronization?对于下面的程序,ClassSubClassBextendsSuperClassA{protectedintc;publicvoidinc(){synchronized(this){c++;}}publicvoiddec(){synchronized((SuperClassA)this){c--;}}}计数器“c”会被线程安全地访问吗?我不确定在“dec()”方法中,SuperClassA强制转换“this”是否引用了同步块(synchronizedb