Tag: multithreading

没有内存屏障的无序写入:数据竞争的唯一可能原因?

在Brian Goetz的实践中通过Java Concurrency时,我遇到了以下行: 当一个变量被多个线程读取并由至少一个线程写入时,会发生数据争用,但读取和写入不是由before-before排序的 。 正确同步的程序是没有数据竞争的程序; 正确同步的程序表现出顺序一致性,这意味着程序中的所有操作似乎都以固定的全局顺序发生。 我的问题是,乱序是写java或其他编程语言中数据竞争条件的唯一原因吗? UPDATE 好的,我做了一些关于数据竞争的调查,并从oracle官方网站上找到了以下内容: 线程分析器检测在执行multithreading进程期间发生的数据争用。 数据竞争发生在: 单个进程中的两个或多个线程同时访问同一个内存位置,并且 至少有一个访问是用于写入,和 线程没有使用任何独占锁来控制它们对该内存的访问。 当这三个条件成立时, 访问顺序是非确定性的 ,并且计算可以根据该顺序从运行到运行给出不同的结果。 某些数据争用可能是良性的(例如,当内存访问用于忙等待时),但许多数据争用是程序中的错误。 在这一部分中,提到: 访问顺序是非确定性的 它是在讨论线程访问内存位置的顺序吗? 如果是,那么同步永远不会保证线程将访问代码块的顺序。 那么,同步如何解决数据竞争问题呢?

正确使用JavaFX任务执行multithreading和线程池

我有一个选项,用户可以从FileChooser提交多个文件,以便由某些代码处理。 结果将是用于读取文件的IO,然后是对存储数据的实际繁重计算。 允许用户选择多个文件,并且由于文件处理不依赖于所选择的任何其他文件,因此使用线程更容易处理此问题。 此外,用户需要有一个按钮列表,每个要取消的任务一个,以及“全部取消”按钮。 因此,我必须考虑选择性地或集体地杀死一个或所有任务的能力。 最后一个要求是我不会让用户通过打开大量文件来阻塞系统。 因此,我想到了一个线程池数量有限的线程池(让我们假设我将它限制为4,任意数字)。 我不确定如何正确地设置这一切。 我有我需要做的逻辑,但使用正确的类是我被困住的地方。 我已经检查了这个资源 ,所以如果答案是某种方式,那么我就误读了这篇文章。 是否有任何JavaFX类可以帮助我解决这种情况? 如果没有,我如何将任务与某种线程池混合? 我是否必须创建自己的线程池,或者是否已经为我提供了一个? 我是否要在包含我愿意允许用户的最大线程数的某个地方创建单身? 我更喜欢使用已经在Java库中的一个,因为我不是multithreading专家,我担心我可能做错了。 由于线程错误似乎是地球上调试的最邪恶的东西,我正在努力确保尽可能正确地做到这一点。 如果没有办法做到这一点,我必须推出自己的实现,那么最好的方法是什么? 编辑:我应该注意,我通常是线程的新手,我之前使用过它们并且我正在阅读它们,但这将是我第一次使用它们,我真的很想做到这一点。

如何使ScheduledExecutorService在其计划任务被取消时自动终止

我正在使用ScheduledExecutorService来关闭网络连接,如果它已打开超过几个小时。 但是,在大多数情况下,网络连接在达到超时之前关闭,因此我取消了ScheduledFuture 。 在这种情况下,我还希望执行程序服务终止并释放其线程池。 令我惊讶的是,这不是开箱即用的:虽然我在调度任务后在执行程序服务上调用了shutdown() ,但执行程序服务在其唯一的计划任务被取消时不会自动终止。 从ExecutorService.shutdown()的JavaDoc中,这种行为甚至可能是正确的,因为可以说取消的任务还没有被“执行”: void java.util.concurrent.ExecutorService.shutdown() 启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有其他影响。 我的问题是,是否可以更改:是否可以将执行程序服务配置为在其唯一的计划任务被取消时自动终止? 或者写为JUnit测试的同一个问题: @Test public void testExecutorServiceTerminatesWhenScheduledTaskIsCanceled() throws Exception { ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); Runnable task = new Runnable() { @Override public void run() { // … } }; ScheduledFuture scheduledTask = scheduler.schedule(task, 2000, TimeUnit.MILLISECONDS); scheduler.shutdown(); // do more configuration here… Thread.sleep(1000); scheduledTask.cancel(false); Thread.sleep(100); assertThat(scheduler.isTerminated(), […]

如何停止Java程序的线程?

我用GUI创建了一个java程序,并在其上放置了一个“停止”按钮。 当我启动程序时,主线程启动10个线程。 现在我希望每当用户点击“停止”按钮时,所有线程应首先终止,然后主线程应该终止。 我怎样才能做到这一点。

如何锁定文件

我有一个write方法,应该安全地将数据写入文件。 // The current file I am writing to. FileOutputStream file = null; … // Synchronized version. private void write(byte[] bytes) { if (file != null && file.getChannel() != null) { try { boolean written = false; do { try { // Lock it! FileLock lock = file.getChannel().lock(); try { // Write the bytes. file.write(bytes); […]

带有时间限制的Runnable

试图构造一个必须在给定时间限制内结束的Runnable 。 目前我正在使用java.util.Timer来中断Runnable线程。 在Runnable启动后立即启动Timer 。 import java.util.Timer; import java.util.TimerTask; public class test { Thread task; Timer timer; public void start(){ task = new Thread(new worker()); timer = new Timer(“timer”,true); task.start(); timer.schedule(new Terminator(),1000*2); } class worker implements Runnable{ @Override public void run() { for (int i = 0 ; i < 2; i++){ try { Thread.sleep(1000); […]

Java线程基础知识

下面两个线程调用有什么区别? 这两个电话会同样行事吗? 注意:我没有同时使用#1和#2,这是最好的选择。 private void startConnections(){ ServerThread server = new ServerThread(); server.start(); // #1 Thread serverThread = new Thread(server); serverThread.start(); //#2 } class ServerThread extends Thread{ public void run(){} }

Lua / Java / LuaJ – 处理或中断无限循环和线程

我正在使用LuaJ在Java中运行用户创建的Lua脚本。 但是,运行永不返回的Lua脚本会导致Java线程冻结。 这也使线程不可中断。 我运行Lua脚本: JsePlatform.standardGlobals().loadFile(“badscript.lua”).call(); badscript.lua包含while true do end 。 我希望能够自动终止陷入不屈的循环的脚本,并允许用户在运行时手动终止他们的Lua脚本。 我已经阅读了有关debug.sethook和pcall的内容 ,但我不确定我是如何正确地将它们用于我的目的。 我也听说沙盒是一个更好的选择,虽然这有点超出我的范围。 这个问题也可能仅扩展到Java线程。 我没有找到关于在一段while (true);中断Java线程的任何确切信息while (true); 。 在线Lua演示是非常有前途的,但似乎“坏”脚本的检测和终止是在CGI脚本而不是Lua中完成的。 我是否可以使用Java调用CGI脚本,后者又调用Lua脚本? 不过,我不确定是否允许用户手动终止他们的脚本。 我丢失了Lua演示源代码的链接,但我手头有它。 这是神奇的路线: tee -a $LOG | (ulimit -t 1 ; $LUA demo.lua 2>&1 | head -c 8k) 有人能指出我正确的方向吗? 一些来源: 嵌入式Lua – 超时流氓脚本(例如无限循环) – 任何人的例子? 防止Lua无限循环 嵌入式Lua – 超时流氓脚本(例如无限循环) – 任何人的例子? 当一些循环执行长任务时如何中断线程? 在Java中指定的时间限制后杀死线程

同步数据读/写主存储器

当一个synchronized方法完成时,它是否只将它修改的数据推送到主存储器或所有成员变量,类似于同步方法执行时,它是否只读取主内存所需的数据,还是清除所有缓存中的成员变量并从主内存中读取它们的值? 例如 public class SharedData { int a; int b; int c; int d; public SharedData() { a = b = c = d = 10; } public synchronized void compute() { a = b * 20; b = a + 10; } public synchronized int getResult() { return b*c; } } 在上面的代码中,假设compute由threadA执行,getResult由threadB执行。 执行compute之后,threadA会用a和b更新主内存,还是会更新a,b,c和d。 在执行getResult之前,threadB只从主内存中获取b和c的值,还是清除缓存并获取所有成员变量a,b,c和d的值?

如何在multithreading操作中使用HttpAsyncClient?

与此问题密切相关: 如何在multithreading操作中使用HttpClient? ,我想知道apache HttpAsyncClient是否是线程安全的,或者它是否也需要使用MultiThreadedHttpConnectionManager或ThreadSafeClientConnManager。 如果它确实需要这样的连接管理器,那么异步库中是否存在一个连接管理器? 我能够在异步库中找到PoolingClientAsyncConnectionManager,但我不确定这是否是我需要的。 或者,我正在考虑使用ThreadLocal为每个线程创建一个HttpAsyncClient对象。 请注意,与我前面提到的问题不同,我需要状态在会话中独立 ,即使多个会话到达同一个域。 如果在会话1中设置了cookie,则会话2中的cookie 不可见。出于这个原因,我还考虑为每个请求创建一个全新的HttpAsyncClient对象,尽管我觉得应该有更好的方法。 谢谢。