草庐IT

synchronization

全部标签

java - 如何在多线程中使用等待和通知协议(protocol)

具体来说,有人能告诉我这段代码有什么问题吗?它应该启动线程,所以应该打印“Enteringthread..”5次,然后等待直到调用notifyAll()。但是,它随机打印“Entering..”和“Done..”并继续等待其他人。publicclassThreadTestimplementsRunnable{privateintnum;privatestaticObjectobj=newObject();ThreadTest(intn){num=n;}@Overridepublicvoidrun(){synchronized(obj){try{System.out.println("E

java - ruby 线程编程,ruby 相当于 java wait/notify/notifyAll

我想知道ruby​​有哪些方法可以替代Java方法:等待通知通知所有人您能否发布一个小片段或一些链接? 最佳答案 你要找的是Thread中的ConditionVariable:require"thread"m=Mutex.newc=ConditionVariable.newt=[]t 关于java-ruby线程编程,ruby相当于javawait/notify/notifyAll,我们在StackOverflow上找到一个类似的问题: https://stac

java - 在 Java 中同步 2 个线程的更简单方法?

我不想确定主线程中的某些代码会在辅助线程执行某些代码之后执行。这是我得到的:finalObjectlock=newObject();finalThreadt=newThread(newRunnable(){publicvoidrun(){synchronized(lock){System.out.println("qwerty");lock.notify();}}});synchronized(lock){t.start();lock.wait();}System.out.println("absolutelysure,qwertyisabove");这是正确的解决方案吗?有没有更短的

Java,没有同步的延迟初始化字段

有时当我需要延迟初始化的字段时,我会使用以下设计模式。classDictionaryHolder{privatevolatileDictionarydict;//someheavyobjectpublicDictionarygetDictionary(){Dictionaryd=this.dict;if(d==null){d=loadDictionary();//costyoperationthis.dict=d;}returnd;}}它看起来像DoubleCheckingidion,但不完全是。没有同步,loadDictionary方法可能会被多次调用。我在并发性很低的时候使用这个模

具有昂贵参数的Java同步方法

我有一个同步方法,似乎“使用”同步的时间比它应该的要长得多。看起来有点像;publicstaticsynchronizedvoidmyMethod(MyParameterp){//body(notexpensive)}调用看起来像;myMethod(generateParameter());众所周知,generateParameter()是一个非常昂贵(需要很长时间)的调用。我的想法是myMethod类上的互斥量在generateParameter()执行期间被阻塞,这是怎么回事?我发现它是一个不同的调试问题,但这似乎是正在发生的事情。 最佳答案

java - 为什么使用私有(private)锁而不是内部锁?

在阅读有关同步的内容时,我遇到了封装可变状态的“监视器模式”。下面是示例代码publicclassMonitorLock{privatefinalObjectmyLock=newObject();Widgetwidget;voidsomeMethod(){synchronized(myLock){//Accessormodifythestateofwidget}}用私有(private)锁代替内在锁在任何方面都更好吗? 最佳答案 是的-这意味着您可以看到所有可能获得该锁的代码(抛开反射的可能性)。如果您锁定this(我假设您指的是“

java - Java 编译器是否优化了空的同步块(synchronized block)?

假设我在代码的某处写了一个空的synchronizedblock:synchronized(obj){//Nocodehere}因此,由于同步块(synchronizedblock)不包含任何代码,JIT编译器是否会通过不锁定obj来优化它,因为它没有用?Java编译器会做一些类似的技巧,例如Lockcoarsening,但是这个同步块(synchronizedblock)是否也会被优化掉?编辑:根据assylias的观点,synchronized(newObject()){//emptyblock}JIT编译器现在是否能够优化它,因为我使用的对象不会转义我的方法?

java - 为什么我们需要在同一个对象上同步 notify() 才能工作

我遇到了java.lang.IllegalMonitorStateException。我提到了this问题,它解决了我的问题。第一个答案是Tobeabletocallnotify()youneedtosynchronizeonthesameobject.synchronized(someObject){someObject.wait();}/*differentthread/object*/synchronized(someObject){someObject.notify();}我的问题是为什么我们需要在同一个对象广告上同步它是如何工作的?据我所知,当我们说synchronized(

java - 在与外部同步相同的对象上进行内部同步

最近我参加了一个关于一些设计模式的讲座:显示了以下代码:publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){//1Singletoninst=instance;//2if(inst==null){synchronized(Singleton.class){//3inst=newSingleton();//4}instance=inst;//5}}}returninstance;}取自:Double-checkedlocking:Taketwo我的问题与上述模式无关,但与同

Java同步问题

我是Java线程和同步的新手。假设我有:publicclassMyClass(){publicsynchronizedvoidmethod1(){//callmethod2();}publicsynchronizedvoidmethod2(){};}当我在实例对象上同步method1()时,这意味着什么?那么,当一个线程在尝试访问synchronizedmethod1()时获取锁时,是否会阻止其他线程从同一对象访问另一个synchronizedmethod2()?假设一个线程在访问method1()时获得了一个锁,但是假设method1()调用了method2(),这也是同步。这可能吗