草庐IT

thread-synchronization

全部标签

java - RxJava : Observable and default thread

我有以下代码:Observable.create(newObservableOnSubscribe(){@Overridepublicvoidsubscribe(@NonNullfinalObservableEmitters)throwsException{Threadthread=newThread(newRunnable(){@Overridepublicvoidrun(){s.onNext("1");s.onComplete();}});thread.setName("background-thread-1");thread.start();}}).map(newFunction

java - 在同步块(synchronized block)中写入 volatile 数组的必要性

有关JMM的问题以及有关在同步块(synchronizedblock)中写入但未同步读取的volatile字段的语义。在下面代码的初始版本中,我没有同步访问,因为它对于早期的需求来说是不必要的(并且滥用自赋值this.cache=this.cache确保了易变的写入语义)。某些要求已更改,需要同步以确保不会发送重复的更新。我的问题是同步块(synchronizedblock)是否排除了对volatile字段的自赋值?//Cacheofbyte[]databyrowandcolumn.privatevolatilebyte[][][]cache;publicbyte[]getData(i

java - 仅本地图值不存在时才创建并放置一个 map 值,并获取它 : thread-safe implementation

使此代码段线程安全的最佳方法是什么?privatestaticfinalMapMAP=newHashMap();publicstaticBputIfNeededAndGet(Akey){Bvalue=MAP.get(key);if(value==null){value=buildB(...);MAP.put(key,value);}returnvalue;}privatestaticBbuildB(...){//business,canbequitelong}以下是我能想到的几个解决方案:我可以使用ConcurrentHashMap,但如果我很好理解,它只是使原子put和get操作线程

java - PMD 消息 "Avoid using java.lang.ThreadGroup; it is not thread safe"

问题:为什么mavenPMD插件对下面的代码行发出以下警告:警告:Avoidusingjava.lang.ThreadGroup;itisnotthreadsafe代码(第二行):Calendarcal=Calendar.getInstance();java.sql.DateendDate=newjava.sql.Date(cal.getTime().getTime());上下文:我有一个java.sql.Date实例:publicclassXYZServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletReque

java - Java thread.stop() 是如何工作的?

我实际上正在寻找一种更简单的方法来终止线程,而不管线程在何处运行。但是互联网上的大多数解决方案都指向我使用boolean标志来控制线程的执行,如果我想停止线程然后将boolean变量设置为false。但是如果runnable中的任务是一个LONG线性任务,这意味着该任务不重复怎么办?在那种情况下,创建一个“while”循环来覆盖整个任务block就不是那么容易了。使用Thread.stop真的很诱人,但警告“已弃用”似乎使用起来很危险。我已经阅读了这篇文章WhyAreThread.stop,Thread.suspend,Thread.resumeandRuntime.runFinali

java - 为什么setContextClassLoader()方法放在Thread上?

为什么setContextClassLoader()方法放在Thread上?什么不同的线程有不同的类加载器?问题是如果我扩展一个ClassLoader并加载一些新类会怎么样。到我的自定义类加载器。现在,我希望它成为上下文类加载器,所以我调用方法Thread.currentThread().setContextClassLoader(loader)。这些新类是否只能在当前线程的上下文中可用?或者它是如何工作的?谢谢 最佳答案 Context类加载器是线程将用来查找类的类加载器。当您编写应用程序服务器或类似的东西时,您主要关心这一点。这

java - 带注释的 Spring + Hibernate : No Hibernate Session bound to thread

我是Spring的新手,我正在尝试使用以下堆栈创建一个webapp:ApacheTomcat7、MySQL、SpringMVC、带有JPA注释的Hibernate3。我正在尝试按照CraigWalls的“SpringinAction,第三版”一书进行学习。首先,我想创建一个页面来显示我手动添加到我的数据库中的一些条目,但看起来我的应用程序无法从我的SessionFactory创建/检索任何Hibernatesession。这是我的根本原因堆栈跟踪:exceptionorg.springframework.web.util.NestedServletException:Requestpr

java - Maven -- maven安装报错: Exception in thread "main" java. lang.UnsupportedClassVersionError

这个问题在这里已经有了答案:Howtofixjava.lang.UnsupportedClassVersionError:Unsupportedmajor.minorversion(50个答案)关闭7年前。在过去的一个小时里,我一直在尝试安装和配置maven-3.3.3。当我输入时:mvn--version我在cmd中收到此错误Exceptioninthread"main"java.lang.UnsupportedClassVersionError:org/apache/maven/cli/MavenCli:Unsupportedmajor.minorversion51.0atjava

java - 如果线程在同步块(synchronized block)中抛出异常会发生什么

考虑多个线程正在尝试访问临界区,一个线程在同步块(synchronizedblock)内发生异常会发生什么,它具有wait()和notify()来累积和释放锁。 最佳答案 同步监视器将被释放:“如果主体的执行曾经完成,无论是正常还是突然,都会在同一监视器上自动执行解锁操作。”Java语言规范17.1.Synchronization.其他线程将能够继续同步,并调用wait和notify。如果发生异常的线程持有一些关键的程序逻辑资源,您可能需要使用try-finally来确保它被释放。 关于

java - synchronized 关键字是否会阻止 Java 中的重新排序?

假设我在Java中有以下代码a=5;synchronized(lock){b=5;}c=5;同步是否会阻止重新排序?a、b、c之间没有依赖关系。会先分配给a,然后分配给b,然后分配给c吗?如果我没有同步,语句可以以JVM选择的任何方式重新排序,对吗? 最佳答案 将赋值锁定到b至少会在赋值前引入一个获取栅栏,在赋值后引入一个释放栅栏。这可以防止将获取栅栏之后的指令移动到栅栏上方,以及将释放栅栏之前的指令移到栅栏下方。使用↓↑符号:a=5;↓b=5;↑c=5;↓防止指令被移动到它上面。↑防止指令被移动到它下面。