Tag: 并发

为什么Java没有看到来自另一个线程的更新值?

请查看此代码(摘自Effective Java book) import java.util.concurrent.TimeUnit; public class Main { private static boolean stopReq; public static void main(String[] args) throws InterruptedException { Thread bgw = new Thread(new Runnable() { public void run(){ int i = 0; while(!stopReq){ i++;} } }); bgw.start(); TimeUnit.SECONDS.sleep(1); stopReq = true; } } 为什么bgw线程陷入无限循环? 它stopReq在到达循环时缓存了自己的stopReq副本? 所以它永远不会看到来自其他线程的更新值? 我理解这个问题的解决方案是同步或volatile变量,但我很好奇为什么这个当前的实现不起作用。 谢谢

Java内存模型 – 有人可以解释一下吗?

多年来,我一直试图理解Java规范中涉及内存模型和并发的部分。 我不得不承认我惨遭失败。 是的’我理解锁和“synchronized”以及wait()和notify()。 我可以使用它们,谢谢。 我甚至对“易变”的含义有一个模糊的想法。 但所有这些都不是源于语言规范 – 而是来自一般经验。 以下是我要问的两个示例问题。 我对特定答案并不是那么感兴趣,因为我需要理解答案是如何从规范中得出的(或者可能是我如何得出规范没有答案)。 “挥发性”究竟做了什么? 写入变量primefaces? 它取决于变量的类型吗?

尽管没有代码明确泄漏,未初始化的对象泄漏到另一个线程?

让我们看看这个简单的Java程序: import java.util.*; class A { static B b; static class B { int x; B(int x) { this.x = x; } } public static void main(String[] args) { new Thread() { void f(B q) { int x = qx; if (x != 1) { System.out.println(x); System.exit(1); } } @Override public void run() { while […]

是否在32位机器上使用Javaprimefaces进行64位分配?

如果我有这样的代码 – long x; x = 0xFFFFFFFFL; 如果我在32位机器上运行此代码,它是否保证是primefaces的,或者可能是读取x的不同线程可能得到不完整/垃圾值?

如何certificate未正确发布的值的竞争条件?

我正在阅读“Java Concurrency in practice”并查看第51页的示例代码。 根据该书,如果没有正确发布,这段代码就有失败的风险。 因为我喜欢编写示例并打破它们以certificate它们的工作原理。 我试图让它抛出一个AssertionError但是失败了。 (引导我回到上一个问题 ) 任何人都可以发布示例代码,以便抛出AssertionError吗? 规则:不要修改Holder类。 public class Holder{ private int n; public Holder(int n){ this.n = n; } public void assertSanity(){ if (n != n) { throw new AssertionError(“This statement is false”); } } } 我修改了类以使其更脆弱但我仍然无法获得AssertionError。 class Holder2 { private int n; private int n2; public Holder2(int n) throws […]

如何包装方法,以便在超过指定的超时时可以终止执行?

我有一个方法,我想打电话。 但是,我正在寻找一种干净,简单的方法来杀死它或强迫它返回,如果执行时间太长。 我正在使用Java。 为了显示: logger.info(“sequentially executing all batches…”); for (TestExecutor executor : builder.getExecutors()) { logger.info(“executing batch…”); executor.execute(); } 我认为TestExecutor类应该implement Callable并继续朝这个方向发展。 但我想要做的就是停止executor.execute()如果它花了太长时间。 建议…? 编辑 收到的许多建议都假设正在执行的方法需要很长时间才能包含某种循环,并且可以定期检查变量。 然而,这种情况并非如此。 因此,某些东西不一定是干净的,只会停止执行,这是可以接受的。

Java Object Reference的发布不正确

下面的例子来自Brian Goetz的书“Java Concurrency in Practice”,第3章,第3.5.1节。 这是不正确发布对象的示例 class someClass { public Holder holder; public void initialize() { holder = new Holder(42); } } public class Holder { private int n; public Holder(int n) { this.n = n; } public void assertSanity() { if (n!=n) throw new AssertionError(“This statement is false”); } } 它表示Holder可能出现在另一个处于不一致状态的线程中,而另一个线程可以观察到部分构造的对象。 怎么会发生这种情况? 你能用上面的例子给出一个场景吗? 此外,它继续说有些情况,当一个线程第一次读取一个字段时可能会看到一个陈旧的值,然后下次再看到一个更新的值,这就是assertSanity可以抛出断言错误的原因。 […]

按顺序运行Java线程

你将如何顺序执行三个线程? 例如。 Thread1,Thread2,Thread3。 无法将一个Thread的引用传递给另一个并从run()方法调用。 所以代码应该是这样的: Thread1.start(); Thread2.start(); Thread3.start(); 应该是 Printing Thread1 Printing Thread2 Printing Thread3 这可以通过使用ThreadPoolExecutor并使用阻塞队列来实现,但即便这样也不是可接受的答案。

在堆栈中还是在堆中分配变量引用的位置?

我有个问题 例如,当我在方法中声明变量时发生的事情。 void myMethod(){ 发货myShip = new Ship(); } 在堆栈或堆中分配myShip引用的位置? 我认为在堆栈中但我很困惑,因为我正在阅读J2ME游戏编程书“Java类被实例化到Java堆上” 所有的java clases? 提前致谢

multithreading套接字通信客户/服务器

我写完了一个工作正常的Client / Server Socket通信程序。 现在我想弄清楚如何制作它,以便我可以同时与服务器建立多个客户端连接。 我环顾四周,似乎有不止两种不同的方式来做到这一点。 所以我来这里向你们寻求帮助/建议。 我的服务器: public class Server { private ServerSocket serverSocket = null; private Socket clientSocket = null; public Server() { try { serverSocket = new ServerSocket(7003); } catch (IOException e) { System.err.println(“Could not listen on port: 7003”); System.exit(1); } try { clientSocket = serverSocket.accept(); } catch (IOException e) { System.err.println(“Accept […]