Tag: 同步

让线程暂停 – Thread.wait()/ Thread.notify()

我试图理解线程是如何工作的,我写了一个简单的例子,我想创建并启动一个新线程,线程,在主线程中显示1到1000的数字,恢复辅助线程,并显示次要线程中的数字从1到1000。 当我省略Thread.wait()/ Thread.notify()时,它的行为与预期一致,两个线程一次显示几个数字。 当我添加这些函数时,由于某种原因,主线程的数字是第二个而不是第一个打印的。 我究竟做错了什么? public class Main { public class ExampleThread extends Thread { public ExampleThread() { System.out.println(“ExampleThread’s name is: ” + this.getName()); } @Override public void run() { for(int i = 1; i < 1000; i++) { System.out.println(Thread.currentThread().getName()); System.out.println(i); } } } public static void main(String[] args) { new Main().go(); } public void […]

Collections.synchronizedList()方法有什么用? 它似乎没有同步列表

我试图使用两个线程将String值添加到ArrayList 。 我想要的是,当一个线程添加值时,另一个线程不应该干扰,所以我使用了Collections.synchronizedList方法。 但似乎如果我没有在对象上显式同步,则以不同步的方式完成添加。 没有显式同步块: public class SynTest { public static void main(String []args){ final List list=new ArrayList(); final List synList=Collections.synchronizedList(list); final Object o=new Object(); Thread tOne=new Thread(new Runnable(){ @Override public void run() { //synchronized(o){ for(int i=0;i<100;i++){ System.out.println(synList.add("add one"+i)+ " one"); } //} } }); Thread tTwo=new Thread(new Runnable(){ @Override public void run() { //synchronized(o){ […]

Clojure STM(dosync)x Java同步块

Clojure STM(dosync)方法和Java同步Block有什么区别? 我正在阅读“睡觉的理发师”问题下面的代码。 ( http://www.bestinclass.dk/index.clj/2009/09/scala-vs-clojure-round-2-concurrency.html ) (defn the-shop [a] (print “[k] entering shop” a) (dosync (if (< (count @queue) seats) (alter queue conj a) (print "[s] turning away customer" a)))) 为了避免竞争条件,使用dosync ,所以我问自己“Java同步块有什么区别(STM)”? 它会阻止这个关键代码吗? 提前致谢 ! 丹塔斯

Java内存模型:重新排序和并发锁定

java meomry模型要求同步在同一监视器上synchronize块对这些块中修改的变量强制执行之前的实现。 例: // in thread A synchronized( lock ) { x = true; } // in thread B synchronized( lock ) { System.out.println( x ); } 在这种情况下,只要线程A已经通过了synchronized -block,就可以保证线程B将看到x==true 。 现在我正在重写大量代码以使用java.util.concurrent更灵活(并且说更快)的锁,尤其是ReentrantReadWriteLock 。 所以这个例子看起来像这样: 编辑 :示例被打破,因为我错误地转换了代码,如matt b所示 。 修正如下: // in thread A lock.writeLock().lock(); { x = true; } lock.writeLock().unlock(); // in thread B lock.readLock().lock(); { […]

不同JVM之间的Java同步

我正在研究的项目会触发各种异步工作来完成一些工作。 在我看来,这些异步作业实际上是作为单独的JVM(单独的Java进程)运行。 这是否意味着如果我需要在这些进程之间进行同步,我将无法使用以下任何一项: 同步方法/块 任何实现java.util.concurrent.locks锁 因为在我看来他们都是线程级的? Java是否像流程之间的信号量一样为IPC提供支持?

螺旋锁的替代品

我使用以下螺旋锁方法: while(!hasPerformedAction()){ //wait for the user to perform the action //can add timer here too } setHasPerformedAction(false); return getActionPerfomed(); 这基本上等待用户执行操作然后返回它。 目前有些东西在继续之前请求用户回答,这就是我等到收到输入的原因。 然而,我想知道这是否效率低,如果我们等待一段时间(即<= 30秒),它会减慢运行此应用程序的电脑的速度。 有没有其他替代方法使用这种方法,即锁,信号量,如果是这样的语法是什么? 谢谢, 阿里

在Java中,如果它是只读的,我是否需要声明我的集合是否已同步?

我的J2EE webapp启动时,我一次填充一个集合。 然后,几个线程可以同时访问它,但只能读取它。 我知道使用同步集合对于并行写入是强制性的,但是我仍然需要它来进行并行读取吗?

双重检查锁定的无序写入

在针对双重检查锁定方案的无序写入中提到的示例中(参考: IBM文章和维基百科文章 ) 在构造函数完全初始化之前,我无法理解为什么Thread1会在同步块中出现的简单原因。 根据我的理解,创建“new”和调用构造函数应该按顺序执行,同步锁不应该释放,直到所有工作都没有完成。 请让我知道我在这里失踪了什么。

wait-notify和CountDownLatch之间的区别

我需要一些帮助来理解使用CountDownLatch优于传统的wait-notify的优点。 我认为notifyAll()确实做了同样的事情,它似乎更容易使用(也许是因为熟悉)。 另外,来自CountDownLatch的wait()和await()有什么区别? 谢谢 ! 编辑:我想我需要改写我的查询: Await()根据文档说: 除非线程被中断,否则导致当前线程等待锁存器倒计数到零。 对我来说很难看出wait()和await()之间的区别 – await()确实在封面下使用了wait(),而且当count到零时似乎有一个隐式的notifyAll()。 我要问的是,为什么我不应该只使用wait-notifyAll()机制(使用我自己的计数器变量处理),而不是使用CountDownLatch?

在两个线程和主程序之间共享一个对象

我是Java的新手,我正在参加并发编程课程。 我拼命想要一个最小的工作示例,可以帮助演示我学过的概念,比如使用’synchronized’关键字并跨线程共享一个对象。 一直在搜索,但无法获得基本框架。 Java程序员,请帮忙。