Tag: 同步

并发代码分析器

我想知道是否有任何框架或应用程序(app)/程序可以分析任何Java代码的并发性? 如果该工具知道jre传送的类和方法的所有实现,那么它归结为对同步块和方法及其调用层次结构的简单分析。 从这里它可以创建一个petri网,并告诉你,如果你可能遇到死锁。 我错过了什么或者这真的很容易吗? 然后必须有一些很酷的工具做这种东西? 或者这样的工具是否会报告太多可能因为一些底层程序/业务逻辑而完全保存的死锁? Petri网应该足够强大以处理这些情况? 这将节省大量工时搜索可能与死锁问题相关或可能不存在的错误。

窗户上的虚假唤醒。 可能吗?

我最近学会了“虚假唤醒”任何人都说这个问题只适用于某些类型的Linux PC。 我用的是windows。 我写了Spurious唤醒测试。 我得到的结果是可能的。 但我想为你展示这个测试。 也许我在某处犯了错误。 我最初的变种: import java.util.Random; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; public class TestSpuriousWakeups { static final int MAX_THREADS = 600; static final Object mutex = new Object(); static final CountDownLatch allThreadsStarted = new CountDownLatch(MAX_THREADS); static final CountDownLatch allThreadsFinished = new CountDownLatch(1); static /*final*/ volatile AtomicInteger processedThreads = new AtomicInteger(); static /*final*/ […]

同步数据读/写主存储器

当一个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的值?

java和同步

我正在准备SCJP考试,我在完全理解同步方面遇到了麻烦。 在第6行,我已经读过在main中运行的线程需要锁定’b’。 为什么需要锁定此对象? 我的理解是同步的代码块是一个受保护的区域,任何时候只有一个线程可以进入? 继续,main中的线程释放此锁并等待’b中的线程完成其run方法。 然后’b’中的线程用于通知main中的线程已完成。 但是,它看起来并不像是通知任何特定的线程。 这个例子来自Sierra和Bates SCJP的书。 任何可以在这上面散发的光都会受到赞赏。 谢谢 class ThreadA { public static void main(String [] args) { ThreadB b = new ThreadB(); b.start(); **synchronized(b) { //line 6** try { System.out.println(“Waiting for b to complete…”); b.wait(); } catch (InterruptedException e) {} System.out.println(“Total is: ” + b.total); } } } } class ThreadB […]

扩展HashMap 并仅同步puts

我最近在代码库上遇到了一个扩展HashMap并同步put方法的类。 除了使用ConcurrentHashMap效率低之外,扩展HashMap和仅同步put(K,V)可能会出现什么样的问题? 假设我们不关心get(K)是否返回最新值(例如,我们可以使用线程覆盖彼此,并且我们不关心如果使用地图的值可能出现的竞争条件作为锁自己)。 例: public class MyMap extends HashMap { //… public synchronized void put(K key, V value) { //… } //… } 据我所知,HashMap使用put方法重新resize,并且因为put在map实例级别同步,所以在(可能)不会遇到并发重新resize时遇到​​的问题。 即使有上面​​可疑的假设,我的直觉也告诉我,可能会出现更多问题。 或者我只是偏执狂? 更新:谢谢大家,这很有趣,也很有启发性。 如果我遇到这个特定class级的作者的原作,我现在可以详细解释他的愚蠢。 🙂 总结:putAll仍然可以搞砸数据结构,最终陷入可怕的无限循环/数据争用状态。 get依赖于hashmap的底层内部数据结构,这些结构可能正在被同时修改,导致get进程表现得很奇怪。 这只是个坏主意。 至少,作者可能已经使用了Collections.synchronizedMap(Map)。 注意:截至本文撰写时给出的所有三个答案实际上都是正确的,但我选择了一个关于get()作为正确答案的答案,因为对我来说这是最不明显的答案。

具有零键function的线程安全映射

我需要一个multithreadingMap对象在我的Web服务器的缓存中使用,我需要null键。 HashMap允许我使用null键,但ConcurrentHashMap不允许。 我尝试使用Collections.synchronizedMap(new HashMap())创建HashMap的同步版本,但它也不接受null键。 有没有我可以使用的替代品,而不必实现某种方式来包装null键?

其他同步方法的方法

除了使用synchronized关键字之外,如何在java中同步方法?

线程在同步块内崩溃时锁定会发生什么?

让我们说Thread-1在对象上同步 synchronize(object){ //statement1 //statement2 //statement3 } 如果Thread-1在statement2上崩溃,对象上的锁会发生什么,当发生这种情况时,JVM会自动释放Thread-1上的锁吗? 因为否则如果Thread-2正在为要释放的对象锁定并且Thread-1崩溃,则Thread-2将永远等待。

“同步”真的只是语法糖吗?

我是multithreading新手,我编写了这段代码,通过同时运行线程增量并打印变量来打印数字1-10000。 这是我正在使用的代码: package threadtest; public class Main{ static int i=0; static Object lock=new Object(); private static class Incrementer extends Thread{ @Override public void run(){ while (true){ synchronized(lock){ if (i>=10000) break; i++; System.out.println(i); } } } } public static void main(String[] args) { new Incrementer().start(); new Incrementer().start(); new Incrementer().start(); new Incrementer().start(); new Incrementer().start(); new Incrementer().start(); } […]

ruby线程编程,ruby相当于java wait / notify / notifyAll

我想知道ruby的Java方法的替代品是什么: 等待 通知 notifyAll的 你能发一个小片段或一些链接吗?