标签: concurrent-programming

Java中有Mutex吗?

在java中是否存在Mutex对象或创建一个?我问,因为用1许可证初始化的信号量对象对我没有帮助.想想这个案例:

try {
   semaphore.acquire();
   //do stuff
   semaphore.release();
} catch (Exception e) {
   semaphore.release();
}
Run Code Online (Sandbox Code Playgroud)

如果在第一次获取时发生异常,则catch块中的释放将增加许可,并且信号量不再是二进制信号量.

请问是正确的方法吗?

try {
   semaphore.acquire();
   //do stuff
} catch (Exception e) {
   //exception stuff
} finally {
   semaphore.release();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码会确保信号量是二进制的吗?

java mutex semaphore java.util.concurrent concurrent-programming

106
推荐指数
5
解决办法
19万
查看次数

yield()的主要用途是什么,它与join()和interrupt()有什么不同?

yield()对Java 中方法的使用有点困惑,特别是在下面的示例代码中.我还读过yield()'用于防止执行线程'.

我的问题是:

  1. 我相信下面的代码在使用yield()和不使用时都会产生相同的输出.它是否正确?

  2. 事实上,什么是主要用途yield()

  3. 在哪些方面与方法yield()不同?join()interrupt()

代码示例:

public class MyRunnable implements Runnable {

   public static void main(String[] args) {
      Thread t = new Thread(new MyRunnable());
      t.start();

      for(int i=0; i<5; i++) {
          System.out.println("Inside main");
      }
   }

   public void run() {
      for(int i=0; i<5; i++) {
          System.out.println("Inside run");
          Thread.yield();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

使用和不使用上面的代码我获得相同的输出yield():

Inside main
Inside main
Inside main
Inside main
Inside main
Inside run
Inside run
Inside run
Inside …
Run Code Online (Sandbox Code Playgroud)

java multithreading yield-keyword concurrent-programming

98
推荐指数
4
解决办法
10万
查看次数

如何让2个JVM相互通信

我有以下情况:

java在本地计算机上运行了2个JVM进程(实际上有2个进程单独运行,而不是2个线程).我们称他们ProcessAProcessB.

我希望他们彼此沟通(交换数据)(例如ProcessA发送消息来ProcessB做某事).

现在,我通过编写临时文件解决此问题,这些进程会定期扫描此文件以获取消息.我认为这个解决方案并不是那么好.

什么是实现我想要的更好的选择?

java ipc concurrent-programming

63
推荐指数
3
解决办法
4万
查看次数

Java 8:并行FOR循环

我听说Java 8提供了很多关于并发计算的实用程序.因此,我想知道并行化给定for循环的最简单方法是什么?

public static void main(String[] args)
{
    Set<Server> servers = getServers();
    Map<String, String> serverData = new ConcurrentHashMap<>();

    for (Server server : servers)
    {
        String serverId = server.getIdentifier(); 
        String data = server.fetchData();

        serverData.put(serverId, data);
    }
}
Run Code Online (Sandbox Code Playgroud)

java concurrency for-loop java.util.concurrent concurrent-programming

60
推荐指数
4
解决办法
5万
查看次数

44
推荐指数
3
解决办法
1万
查看次数

如何更好地解释"僵局"?

我正在努力用简单的词语解释线程中的"死锁",所以请帮忙.什么可能是"死锁"(例如,在Java中)的最佳示例,以及它如何在步骤中发生以及如何防止它?但是没有深入细节.我知道这就像问两个相反的事情,但仍然.如果您有任何以前的并发编程培训经验 - 那将是一流的!

concurrency multithreading deadlock concurrent-programming

30
推荐指数
4
解决办法
1万
查看次数

这是在C#中迭代Concurrentdictionary的正确方法吗?

我只是用这个代码作为例子.假设我有以下Person类.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dictionaryDisplay
{
class Person
{
    public string FirstName { get; private set;}
    public string LastName { get; private set; }

    public Person(string firstName, string lastName)
    {
        this.FirstName = firstName;
        this.LastName = lastName;

    }

    public override string ToString()
    {
        return this.FirstName + " " + this.LastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

}

主要计划

static void Main(string[] args)
    {
        ConcurrentDictionary<int, Person> personColl = new ConcurrentDictionary<int,   Person>();

        personColl.TryAdd(0, new Person("Dave","Howells"));
        personColl.TryAdd(1, new Person("Jastinder","Toor"));

        Person outPerson = …
Run Code Online (Sandbox Code Playgroud)

c# concurrent-programming

30
推荐指数
1
解决办法
2万
查看次数

如何在java中停止执行Executor ThreadPool?

我正在使用java中的Executors来同时运行更多线程.我有一组Runnable对象,我将它分配给Exceutors.执行程序工作正常,一切都很好.但是在池中执行所有任务后,java程序没有终止,我认为Executor需要一些杀死线程的时间.请任何人帮助我减少执行者执行所有任务后所花费的时间.

concurrent-programming

24
推荐指数
2
解决办法
3万
查看次数

Java:引用转义

请阅读以下代码是"不安全构造"的示例,因为它允许此引用转义.我无法理解'这个'是如何逃脱的.我是java世界的新手.任何人都可以帮助我理解这一点.

public class ThisEscape {
    public ThisEscape(EventSource source) {
        source.registerListener(
            new EventListener() {
                public void onEvent(Event e) {
                    doSomething(e);
                }
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

java concurrent-programming

24
推荐指数
3
解决办法
5064
查看次数

Java阻塞问题:为什么JVM会在许多不同的类/方法中阻塞线程?

更新:这看起来像一个内存问题.一个3.8 Gb的Hprof文件表明,当发生"阻塞"时,JVM正在转储它的堆.我们的运营团队发现该站点没有响应,进行了堆栈跟踪,然后关闭了该实例.我相信他们在堆转储完成之前关闭了网站.日志没有错误/异常/问题证据 - 可能是因为JVM在生成错误消息之前被杀死了.

原始问题我们最近出现了应用程序出现的情况 - 最终用户 - 要挂起.我们在应用程序重启之前得到了一个堆栈跟踪,我发现了一些令人惊讶的结果:527个线程,463个线程状态为BLOCKED.

在过去 过去被阻塞的线程通常有这个问题:1)一些明显的瓶颈:例如一些数据库记录锁定或文件系统锁定问题导致其他线程等待.2)所有被阻塞的线程将阻塞相同的类/方法(例如jdbc或文件系统clases)

不寻常的数据 在这种情况下,除了应用程序类(包括jdbc和lucene调用)之外,我还看到了各种类/方法被阻止,包括jvm内部类,jboss类,log4j等.

问题 是什么会导致JVM阻止log4j.Hierarchy.getLogger,java.lang.reflect.Constructor.newInstance?显然有些资源"稀缺",但哪些资源?

谢谢

堆栈跟踪摘录

http-0.0.0.0-80-417" daemon prio=6 tid=0x000000000f6f1800 nid=0x1a00 waiting for monitor entry [0x000000002dd5d000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at sun.reflect.GeneratedConstructorAccessor68.newInstance(Unknown Source)
                at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
                at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
                at java.lang.Class.newInstance0(Class.java:355)
                at java.lang.Class.newInstance(Class.java:308)
                at org.jboss.ejb.Container.createBeanClassInstance(Container.java:630)

http-0.0.0.0-80-451" daemon prio=6 tid=0x000000000f184800 nid=0x14d4 waiting for monitor entry [0x000000003843d000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at java.lang.Class.getDeclaredMethods0(Native Method)
                at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
                at java.lang.Class.getMethod0(Class.java:2670)

"http-0.0.0.0-80-449" daemon prio=6 tid=0x000000000f17d000 nid=0x2240 waiting for monitor entry …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection locking blocking concurrent-programming

17
推荐指数
1
解决办法
2万
查看次数