Tag: 并发

Java 1.4同步:只允许一个方法实例运行(非阻塞)?

我有一个类提出翻译实用程序。 翻译本身应每30分钟重新加载一次。 我使用Spring Timer支持。 基本上,我的class级看起来像: public interface Translator { public void loadTranslations(); public String getTranslation(String key); } loadTranslations()可能需要很长时间才能运行,因此在运行时,旧的翻译仍然可用。 这是通过在本地Map中加载翻译并在加载所有翻译时更改参考来完成的。 我的问题是:我如何确保当一个线程已经加载翻译时,第二个也尝试运行,它会检测到并立即返回,而不开始第二次更新。 一个synchronized方法只会对负载进行排队……我还在Java 1.4上,所以没有java.util.concurrent。 谢谢你的帮助 !

newFixedThreadPool的内部工作

请帮助我理解newFixedThreadPool(或Cached)的内部流程 当我们写下面的语句时,ExecutorService e = Executors.newFixedThreadPool(3); e.execute(runaable1); e.execute(runaable2); e.execute(runaable3); e.execute(runaable4); e.execute(runaable5); 直到3个执行方法,将创建三个线程,当调用第四个执行方法时,不会创建新线程,但工作将等待线程空闲。 我不明白这一点“不会创建新的线程,但工作将等待线程自由。” 我认为当runnable1将被赋予第一个创建的线程时,一旦runnable1的run方法完成,Thread1的运行也将完成,thread1将无法调用runnable4的run方法。 那么,java如何通过3个线程来管理执行5 Runnable。

AtomicBoolean与同步块有什么区别

我试图理解以下两个代码块之间的区别 AtomicBoolean ab = new AtomicBoolean(false); using the following to get and set state. . ab.get(); ab.set(X); vs. private boolean ab = false; private final Object myboollock = new Ojbect(); public void setAB(boolean state) { synchronized(myboollock) { ab = state; } } public boolean getAB() { synchronized(myboollock) { return ab; } } 我需要线程保护一个布尔值,就是所有,并且过去使用过后面的方法,但是想开始使用Atomic对象,(如果)它们是安全的吗?

在这种情况下,是否会抛出此AssertionError?

首先是代码,来自JCIP列出http://jcip.net/listings/StuffIntoPublic.java和http://jcip.net/listings/Holder.java public class SafePublication { public static void main(String[] args) throws InterruptedException { // System.out.println(Thread.currentThread().getName()); StuffIntoPublic t = new StuffIntoPublic(); t.initialize(); while (true) { new Thread(() -> { t.holder.assertSanity(); }).start(); } } } //@author Brian Goetz and Tim Peierls class StuffIntoPublic { public Holder holder; public void initialize() { // System.out.println(Thread.currentThread().getName()); holder = new Holder(42); […]

为什么java ThreadPoolExecutor在发生RuntimeException时会终止线程?

调用execute方法时为什么在worker中重新抛出unhandedexception? 结果,新的Thread将在下次执行时创建,以最大化线程数

字符串的plus运算符的线程安全性,包括优化

这篇文章说a += b相当于 a = new StringBuilder() .append(a) .append(b) .toString(); 假设我有这个代码: public class MultiThreadingClass extends SomeThirdPartyClassThatExtendsObject{ public void beginmt(String st) throws IOException { //st is a thread number st = new File(“c:\\somepath”).getCanonicalPath()+”\\”+st; System.out.println(st); } } 假设beginmt在MultiThreading类的单个实例上同时运行多次(线程号为1到15500)。 可能有这样的情况,它可以打印以下,即一些线程数丢失,一些数字加倍? c:\somepath\2 c:\somepath\1 c:\somepath\1 c:\somepath\4 c:\somepath\5 c:\somepath\6 c:\somepath\7 c:\somepath\8 c:\somepath\8 c:\somepath\10 … 编辑: 是否安全地说+运算符不会进入某些不安全的发布问题? 我认为StringBuilder可以优化为类似于实例变量的东西,在这种情况下它可能会被不安全地发布。 编辑2: 就JLS,上述post以及上述代码的类似类文件进行检查,要使用的StringBuilders似乎必须包含在不同的堆栈帧中。 但是,我仍然想检查某种forms的激进优化是否会导致StringBuilders以某种方式被集中式StringBuilder替换。 这听起来是可能的,因为当优化器预测对象刚刚以非常数方式实现时实际上这样的对象可以是常量时,优化器优化是合乎逻辑的。 […]

Java Hashmap – multithreading放

我们最近在我的工作中讨论过我们是否需要使用ConcurrentHashMap,或者我们是否可以在multithreading环境中使用常规HashMap。 HashMaps的参数是两个:它比ConcurrentHashMap快,所以我们应该尽可能使用它。 而ConcurrentModificationException显然只会在你修改时迭代Map时出现,所以“如果我们只从地图中PUT和GET,那么常规HashMap有什么问题?” 是争论。 我认为并发PUT操作或并发PUT和READ可能会导致exception,所以我组合了一个测试来certificate这一点。 测试很简单; 创建10个线程,每个线程将相同的1000个键值对一次又一次地写入地图5秒钟,然后打印生成的地图。 结果实际上很混乱: Length:1299 Errors recorded: 0 我认为每个键值对在HashMap中都是唯一的,但是通过查看地图,我可以找到多个相同的Key-Value对。 我期待某种exception或损坏的键或值,但我没想到这一点。 这是怎么发生的? 这是我使用的代码,供参考: public class ConcurrentErrorTest { static final long runtime = 5000; static final AtomicInteger errCount = new AtomicInteger(); static final int count = 10; public static void main(String[] args) throws InterruptedException { List threads = new LinkedList(); final Map map […]

当我重新涂抹太多时,停止在摇摆中闪烁

我正在制作一个带有tilemap的RPG。 为了生成tilemap,我循环通过一个二维数组,但这意味着当我重新绘制时,我必须每次都这样做。 如果我重画太多屏幕闪烁,我怎么能阻止这个。 package sexyCyborgFromAnOtherDimension; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Timer; import java.util.TimerTask; import javax.swing.JPanel; @SuppressWarnings(“serial”) public class Game extends JPanel { KeyLis listener; int mapX = 20; int mapY = 20; boolean up = false; boolean down = false; boolean […]

为什么getEntry(Object key)没有在HashMap上公开?

这是我的用例,我有一个逻辑上等于我的HashMap键但不是同一个对象(不是==)的对象。 我需要从HashMap中获取实际键对象,以便我可以在其上进行同步。 我知道我可以遍历ketSet,但与散列相比,这是缓慢的。 通过java.util.HashMap实现,我看到了一个正是我需要的getEntry(Object key)方法。 知道为什么没有曝光吗? 你能想到我能把钥匙拿出来的其他任何方式吗?

Fork-Join相关:join()vs get()vs invoke()

是否有必要使用join()和fork()或者我也可以使用join() , get() , invoke() 。 我检查了API ,除了get()抛出InterruptedException和ExecutionException我没有看到差异……而invoke()似乎完全相同。 但是我总是看到与join()相关的fork()而不是其他两种方法……它们不提供并行性吗? 将invoke()和join()完全相同的目的是什么? 通过实现future,我可以理解get(),但是invoke()和join()呢。 提前致谢。 编辑 :我在API中的不好实际引用了它,因为已经收到的答案指出了它。 但他们的意思是: 方法invoke()在语义上等同于fork(); join()但总是尝试在当前线程中开始执行 提前致谢。