草庐IT

Multithreading

全部标签

java - 锁拆分与锁 strip 化

以下是Joshua的EffectiveJava的摘录:Ifyoudosynchronizeyourclassinternally,youcanusevarioustechniquestoachievehighconcurrency,suchaslocksplitting,lockstriping,andnonblockingconcurrencycontrol.上面表明锁拆分和锁strip化是两种不同的技术,但是当我试图找到它们之间的区别时,我找不到区别。它们之间有区别还是一样? 最佳答案 锁拆分是关于为类功能的不同部分使用不同的锁

Java 赋值问题——这是原子的吗?

我有一些关于Java赋值的问题。字符串我有一个类:publicclassTest{privateStrings;publicsynchronizedvoidsetS(Stringstr){s=s+"-"+str;}publicStringgetS(){returns;}}我在我的setter中使用“同步”,并在我的getter中避免使用它,因为在我的应用程序中,有大量的数据获取和很少的设置。设置必须同步以避免不一致。我的问题是:获取和设置变量是原子的吗?我的意思是,在多线程环境中,Thread1即将设置变量s,而Thread2即将获得“s”。getter方法有什么方法可以获得与s的旧值

java - Java : pattern or anti-pattern? synchronized 的混淆使用

我正在对不属于我的Java产品进行代码审查。我不是Java专家,但我强烈怀疑这是毫无意义的,并且表明对同步工作原理存在根本性的误解。synchronized(this){this.notify();}但我可能错了,因为Java不是我的主要Playground。也许这样做是有原因的。如果您能告诉我开发人员的想法,我将不胜感激。 最佳答案 这当然不是毫无意义的,你可以让另一个线程引用包含上述代码的对象synchronized(foo){foo.wait();}为了在有事发生时被唤醒。不过,在许多情况下,在内部/私有(private)锁对

java - 如何调用线程在java中的特定时间运行?

我想让线程在特定的准确时间执行(例如:2012-07-1113:12:24和2012-07-1115:23:45)我检查了ScheduledExecutorService,但它只支持在第一次运行后的特定时间段后执行,我没有任何固定时间段,而是我有时间从数据库中执行任务。在上一个不同问题的问题中here,TimerTask是解决方案,但显然我不能使线程成为TimerTask作为Runnable和TimerTask都有方法run需要实现的。这里的问题是,如果我让线程扩展TimerTask并实现run(),这行得通吗?如果没有,那么怎么可能做我想做的事呢? 最佳答

Java 线程 : Should all shared variables be Volatile ?

这个问题在这里已经有了答案:Javavolatilemodifierandsynchronizedblocks(3个答案)关闭5年前。我想了解多线程在Java中是如何工作的。我了解Volatile和Synchronization之间的区别。Volatile与可见性有关,不保证同步。当我们使用多线程环境时,每个线程都会在它们正在处理的变量的本地缓存中创建自己的副本。更新此值时,更新首先发生在本地缓存副本中,而不是实际变量中。因此,其他线程不知道其他线程正在更改的值。这就是volatile发挥作用的地方。volatile字段会立即写入主内存,并从主内存进行读取。摘自ThinkingInJa

java - 多个线程调用静态辅助方法

我有一个在Tomcat上运行的Web应用程序。Web应用程序中的多个位置需要进行多项计算。我可以进行这些计算静态辅助函数吗?如果服务器有足够的处理器核心,那么对该静态函数的多个调用(由对不同servlet的多个请求产生)是否可以并行运行?还是一个请求必须等到另一个请求完成调用?publicclassHelper{publicstaticvoiddoSomething(intarg1,intarg2){//dosomethingwiththeargsreturnval;}}如果调用并行运行:我有另一个带有静态函数的辅助类,但是这个类包含一个在静态函数中使用的私有(private)静态成员

java - 在不卡住 UI 线程的情况下实现游戏循环的最佳方法

我正在尝试用Java制作一个简单的2D游戏。到目前为止,我有一个JFrame,带有一个菜单栏,以及一个扩展JPanel并覆盖它的paint方法的类。现在,我需要启动一个游戏循环,我将在其中更新图像的位置等。但是,我坚持如何最好地实现这一目标。我是否应该使用多线程,因为如果你在主线程上放置一个无限循环,UI(以及我的菜单栏)肯定会卡住?到目前为止,这是我的代码:importjava.awt.Color;importjava.awt.Graphics;importjavax.swing.JPanel;@SuppressWarnings("serial")publicclassGameCan

java - ArrayBlockingQueue 和添加 vs 放置 vs 容量

来自ArrayBlockingQueue的JavadocArrayBlockingQueue:addpublicbooleanadd(Ee)Insertsthespecifiedelementatthetailofthisqueueifitispossibletodosoimmediatelywithoutexceedingthequeue'scapacity,returningtrueuponsuccessandthrowinganIllegalStateExceptionifthisqueueisfull.我总是这样解释这个语句(ifispossibletodosoimmediat

java - ThreadLocal 与 Runnable 中的局部变量

ThreadLocal和Runnable中的局部变量哪个优先?出于性能原因。我希望使用局部变量能为cpu缓存等提供更多机会。 最佳答案 WhichoneamongThreadLocaloralocalvariableinRunnablewillbepreferred.如果您有一个在线程类(或Runnable)中声明的变量,那么局部变量将起作用,您不需要ThreadLocal。newThread(newRunnable(){//noneedtomakethisathreadlocalbecauseeachthreadalready//

java - notify可以多次唤醒同一个线程吗?

假设您在Java中有一个典型的生产者-消费者模式。为了提高效率,您希望在将新元素添加到队列时使用notify()而不是notifyAll()。如果两个生产者线程调用通知,是否保证两个不同的等待消费者线程将被唤醒?或者可能是两个notify()相继触发导致同一个comsumer线程两次排队等待唤醒?我找不到该部分是描述其具体工作原理的API。java是否有一些原子内部操作来唤醒线程一次?如果只有一个消费者在等待,那么第二个通知就会丢失,这没问题。 最佳答案 我的回答包含一些特定于实现的信息。它基于我对SunJVM和其他线程库行为的工作