Tag: 并发

Java:嵌套同步块

我在Heinz Kabutz的Java专家通讯版本中看到了这一点,虽然Kabutz博士的文章的其余部分(实际上是全部)都得到了很好的解释和详细说明,但他似乎很清楚这段代码的作用,或者更重要的是,它的意义是: public class SomeObject { private Object lock1; private Object lock2; public void doSomething() { synchronized(lock1) { synchronized(lock2) { // … } } } } 嵌套synchronized块的含义是什么? 这如何影响尝试doSomething()不同线程?

MySQL Connector / JDBC线程安全吗?

标准的MySQL JDBC驱动程序是否是线程安全的? 具体来说,我想在所有线程中使用单个连接,但每个语句只能在单个线程中使用。 是否存在某些安全的情况,而其他情况则不安全? 你在这里有什么经历?

为什么这个简单的Java Swing程序会冻结?

下面是一个简单的Java Swing程序,它由两个文件组成: Game.java GraphicalUserInterface.java 图形用户界面显示“新游戏”按钮,然后显示编号为1到3的其他三个按钮。 如果用户点击其中一个编号按钮,游戏会将相应的数字打印到控制台上。 但是,如果用户单击“新游戏”按钮,程序将冻结。 (1)为什么程序会冻结? (2)如何重写程序来解决问题? (3)如何更好地编写程序? 资源 Game.java : public class Game { private GraphicalUserInterface userInterface; public Game() { userInterface = new GraphicalUserInterface(this); } public void play() { int selection = 0; while (selection == 0) { selection = userInterface.getSelection(); } System.out.println(selection); } public static void main(String[] args) { Game game […]

如何使用单个spark上下文在Apache Spark中运行并发作业(操作)

它在Apache Spark文档中说“ 在每个Spark应用程序中,多个”作业“(Spark动作)如果由不同的线程提交,可能会同时运行 ”。 有人可以解释如何实现以下示例代码的并发性吗? SparkConf conf = new SparkConf().setAppName(“Simple_App”); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD file1 = sc.textFile(“/path/to/test_doc1”); JavaRDD file2 = sc.textFile(“/path/to/test_doc2”); System.out.println(file1.count()); System.out.println(file2.count()); 这两个工作是独立的,必须同时运行。 谢谢。

易变量和其他变量

以下是来自经典Concurency in Practice : 当线程A写入volatile变量并且随后线程B读取相同的变量时,在写入volatile变量之前A可见的所有变量的值在读取volatile变量后变为B可见。 我不确定我是否真的能理解这句话。 例如,在这种情况下所有变量的含义是什么? 这是否意味着使用volatile也会对非易失性变量的使用产生副作用? 在我看来,这句话有一些我无法理解的微妙含义。 有帮助吗?

为什么线程会自动从wait()中唤醒?

我想知道为什么线程会自动从java中的wait()中唤醒。 这是一个设计决定吗? 这是妥协吗? 编辑:(来自Java Concurrency in Practice,p.300) wait甚至被允许返回“虚假” – 不响应任何调用通知的线程。 作者进一步指出: 这就像一个连接器松动的烤面包机,当烤面包准备好时,铃铛会关闭,有时候还没有准备好。 这就是为什么你总是需要像 synchronized(this){ while(!condition) wait(); } } 永不 synchronized(this){ if(!condition){ wait(); } } 即使条件仅从false转换为true 。

Java ExecutorService暂停/恢复特定线程

有没有办法使用ExecutorService来暂停/恢复特定的线程? private static ExecutorService threadpool = Executors.newFixedThreadPool(5); 想象一下,我想停止线程,因为id = 0(假设为每个线程分配一个增量id,直到达到线程池的大小)。 过了一会儿,按一个按钮让我们说,我想恢复那个特定的线程,并让所有其他线程保持其当前状态,可以暂停或恢复。 我在Java文档中找到了一个未完成的PausableThreadPoolExecutor版本。 但它不适合我需要的东西,因为它恢复了池中的所有线程。 如果没有办法使用ExecutorService的默认实现,那么任何人都可以指出我对这个问题的Java实现吗? 谢谢!

java数组线程安全

一个线程从数组的一个索引读取是否有任何并发​​问题,而另一个线程写入数组的另一个索引,只要索引不同? 例如(这个例子不一定推荐用于实际用途,仅用于说明我的观点) class Test1 { static final private int N = 4096; final private int[] x = new int[N]; final private AtomicInteger nwritten = new AtomicInteger(0); // invariant: // all values x[i] where 0 <= i = nwritten.get()) throw new IllegalArgumentException(); return x[index]; } // write() is synchronized to handle multiple writers // (using compare-and-set […]

ArrayBlockingQueue使用单个锁进行插入和删除,但LinkedBlockingQueue使用2个单独的锁

我正在浏览ArrayBlockingQueue和LinkedBlockingQueue的源代码。 LinkedBlockingQueue有一个putLock和一个takeLock分别用于插入和删除,但ArrayBlockingQueue只使用1个锁。 我相信LinkedBlockingQueue是基于简单,快速,实用的非阻塞和阻塞并发队列算法中描述的设计实现的 。 在本文中,他们提到他们保留一个虚拟节点,以便入队者永远不必访问头部,而且出队员永远不必访问尾部,这避免了死锁情况。 我想知道为什么ArrayBlockingQueue没有借用相同的想法并使用2个锁而不是。

设置方法/线程的最大执行时间

我有一个写入数据库的方法。 要求是确保在经过一段时间后该方法不会执行。 如果它在此之前返回,则不应该做任何事情。 我能想到的一个基本方法是做这样的事情。 public class LimitedRuntime { public static void writeToDb(){ // writes to the database } public static void main(String[] args) { long totalExecutionTime = 8000L; long startTime = System.currentTimeMillis(); while(System.currentTimeMillis() – startTime < totalExecutionTime ) { writeToDb(); } } } 这种方法的一个问题是,即使该方法在最大总执行时间之前返回,即使这样,程序也会停止以等待经过的时间。 我怎样才能做得更好(或者更正确)? 如果我们使用Thread ,我们怎样才能找出哪个Thread执行该方法?