草庐IT

Multithreading

全部标签

java - 本地最终引用的安全发布

我知道您可以通过写入对final或volatile字段的引用来安全地发布一个非线程安全对象,该字段稍后将由另一个线程读取,前提是在发布时,创建对象的线程会丢弃对它的引用,这样它就不会再干扰或不安全地观察对象在其他线程中的使用。但是在这个例子中,没有显式的final字段,只有final局部变量。如果调用者放弃对unsafe的引用,这个发布是安全的吗?voidpublish(finalUnsafeunsafe){mExecutor.execute(newRunnable(){publicvoidrun(){//dosomethingwithunsafe}}}我找到了一些问答,比如thiso

java - 有条件地定义同步块(synchronized block)

假设我有一个方法:publicvoidrun(){synchronized(this.foo){}}但有时当我运行这个方法时,我不需要同步任何东西。什么是有条件地同步某些东西的好模式?我能想到的唯一模式是回调,像这样:publicvoidconditionalSync(Runnabler){if(bar){r.run();return;}synchronized(this.foo){r.run();}}publicvoidrun(){this.conditionalSync(()->{});}还有没有回调的其他方法吗? 最佳答案 也

java - 如何使用 Java 检测同步冲突

我想知道有什么好的方法可以对同步或其他东西进行断言,以便我可以检测同步违规(在测试时)。例如,如果我有一个不是线程安全的类并且也不会是线程安全的,那将用于这种情况。如果从多个线程调用它的某些方法,我会有一些断言会通知我(日志或其他东西)。我渴望可以为AWT调度线程制作类似的东西:publicstaticvoidcheckDispatchThread(){if(!SwingUtilities.isEventDispatchThread()){thrownewRuntimeException("GUIchangemadeoutsideAWTdispatchthread");}}我只想要更通

Java等待()/加入(): Why does this not deadlock?

给定以下Java代码:publicclassTest{staticprivateclassMyThreadextendsThread{privatebooleanmustShutdown=false;@Overridepublicsynchronizedvoidrun(){//loopanddonothing,justwaituntilwemustshutdownwhile(!mustShutdown){try{wait();}catch(InterruptedExceptione){System.out.println("Exceptiononwait()");}}}publicsy

java - 跟踪 Java 线程的创建和生命周期

是否有任何工具可用于跟踪Java线程的创建和生命周期?我会对以下所有内容感兴趣:调用newThread()的调用栈调用start()的调用栈run()方法的生命周期 最佳答案 我已经编写并发布了一个开源工具来回答这个问题。JavaLiveThreadAnalyser我已经在博客中介绍了该工具here. 关于java-跟踪Java线程的创建和生命周期,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/qu

java - 从java中的另一个线程访问一个线程的变量

我试图在java的另一个线程中访问和修改一个线程的变量,但我真的不知道该怎么做。例如:Runnabler1=newRunnable(){intvalue=10;publicvoidrun(){//randomstuff}}Runnabler2=newRunnable(){publicvoidrun(){//ofcoursethebellowlinewillnotworkr1.value--;//Iwantheretobeabletodecrementthevariable"value"ofr1}}Threadt1=newThread(r1);Threadt2=newThread(r2)

java - sleep() 方法如何在给定线程和输出上工作?

据我所知,sleep()用于让线程hibernate指定时间。我做了两个示例-在示例1中,我得到的输出为1,2,3,4因为我只创造了一个。在示例2中,我创建了线程的2个实例,并得到输出1,1,2,2,3,3,4,4。为什么第一个线程的输出不是1、2、3、4,然后是1,2,3,4是第二个吗?示例1://Usingsleep()methodpublicclassAaaextendsThread{publicvoidrun(){for(inti=1;i示例2://Usingsleep()methodpublicclassAaaextendsThread{publicvoidrun(){for

java - Spring 的多线程

我正在尝试进入spring多线程,我有几个问题。我在ThreadRating类中有可运行的方法。现在我不确定使用它的最佳方式。我找到的选项1:privatevoidupdateRating(){ExecutorServiceexecutor=Executors.newFixedThreadPool(10);for(inti=0;i这似乎运行良好。for循环后,等待线程执行完毕结束。我尝试的第二个选项privateTaskExecutortaskExecutor;publicUpdateBO(TaskExecutortaskExecutor){this.taskExecutor=task

Java - 信号量中的优先级

我有多个线程访问外部资源——浏览器。但是一次只有一个线程可以访问它。所以,我使用信号量来同步它们。但是,一个从GUI获取输入然后访问浏览器获取结果的线程应该优先于其他线程,我不确定如何使用信号量来实现它。我在想,每个线程在获取到信号量后,都会检查队列中是否有优先级线程在等待,如果有,就释放它,重新等待。只有优先级线程获取后不释放。这是一个很好的解决方案还是我可以使用JavaAPI中的其他任何内容? 最佳答案 Java中没有同步原语可以让您以您想要的方式将一个线程优先于其他线程。但是您可以使用另一种方法来解决您的问题。不是同步线程,而

java - 对象构造在实践中是否保证所有线程都看到已初始化的非最终字段?

Javamemorymodel保证对象的构造和终结器之间存在先行关系:Thereisahappens-beforeedgefromtheendofaconstructorofanobjecttothestartofafinalizer(§12.6)forthatobject.以及final字段的构造函数和初始化:Anobjectisconsideredtobecompletelyinitializedwhenitsconstructorfinishes.Athreadthatcanonlyseeareferencetoanobjectafterthatobjecthasbeencomp