在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
我yield()对Java 中方法的使用有点困惑,特别是在下面的示例代码中.我还读过yield()'用于防止执行线程'.
我的问题是:
我相信下面的代码在使用yield()和不使用时都会产生相同的输出.它是否正确?
事实上,什么是主要用途yield()?
在哪些方面与方法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在本地计算机上运行了2个JVM进程(实际上有2个进程单独运行,而不是2个线程).我们称他们ProcessA为ProcessB.
我希望他们彼此沟通(交换数据)(例如ProcessA发送消息来ProcessB做某事).
现在,我通过编写临时文件解决此问题,这些进程会定期扫描此文件以获取消息.我认为这个解决方案并不是那么好.
什么是实现我想要的更好的选择?
我听说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
我正在努力用简单的词语解释线程中的"死锁",所以请帮忙.什么可能是"死锁"(例如,在Java中)的最佳示例,以及它如何在步骤中发生以及如何防止它?但是没有深入细节.我知道这就像问两个相反的事情,但仍然.如果您有任何以前的并发编程培训经验 - 那将是一流的!
我只是用这个代码作为例子.假设我有以下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) 我正在使用java中的Executors来同时运行更多线程.我有一组Runnable对象,我将它分配给Exceutors.执行程序工作正常,一切都很好.但是在池中执行所有任务后,java程序没有终止,我认为Executor需要一些杀死线程的时间.请任何人帮助我减少执行者执行所有任务后所花费的时间.
请阅读以下代码是"不安全构造"的示例,因为它允许此引用转义.我无法理解'这个'是如何逃脱的.我是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) 更新:这看起来像一个内存问题.一个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