Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步和信号量_Java_Multithreading_Synchronization_Semaphore - Fatal编程技术网

Java 同步和信号量

Java 同步和信号量,java,multithreading,synchronization,semaphore,Java,Multithreading,Synchronization,Semaphore,我在一张地图上循环,我有很多线索。 映射中的队列包含操作。我的目标是给每个线程一个要执行的操作。。但没有2个线程(或更多线程)可以从一个队列运行2个任务(或更多) 这意味着每个线程都将搜索一个队列,并以某种方式锁定该队列,并检查该队列是否有操作。如果有,则运行其中一个操作。如果没有,则搜索另一个队列以针对它们运行操作。 注意:队列数可以大于线程数 E 我尝试在“Map.Entry”上同步 public void run() { while (true)

我在一张地图上循环,我有很多线索。 映射中的队列包含操作。我的目标是给每个线程一个要执行的操作。。但没有2个线程(或更多线程)可以从一个队列运行2个任务(或更多) 这意味着每个线程都将搜索一个队列,并以某种方式锁定该队列,并检查该队列是否有操作。如果有,则运行其中一个操作。如果没有,则搜索另一个队列以针对它们运行操作。 注意:队列数可以大于线程数 E 我尝试在“Map.Entry”上同步

        public void run() {

            while (true) {
                Action<?> act;
                for (Map.Entry entry :ActionMap.entrySet()) {
                   Synchronized(entry)
                   {
                      act =  ((Queue<Action>)entry.getValue()).poll();
                      if (act == null)
                        break;
                   }
                }

            }
            }  
public void run(){
while(true){
行动法;
对于(Map.Entry:ActionMap.entrySet()){
已同步(条目)
{
act=((队列)entry.getValue()).poll();
if(act==null)
打破
}
}
}
}  
问题是,如果另一个线程正在搜索要执行的操作,那么它将卡在同步行中,等待第一个线程完成任务或完成等待,而这不是我想要的。 我希望所有线程都搜索队列,如果某个线程到达另一个线程正在处理的队列,只需跳过它并继续搜索即可

所以我四处搜寻,找到了信号灯,所以我找到了这个

Semaphore Gate = new Semaphore(1);



        public void run() {

            while (true) {
                Action<?> act;
                for (Map.Entry entry :ActionMap.entrySet()) {
                   if( Gate.tryAcquire());
                   {
                      act =  ((Queue<Action>)entry.getValue()).poll();
                      if (act == null){
                    Gate.Release();
                    break;

                      }
                      else {
                      act.handle();
                      Gate.Release();
                    }
                   }
                }

            }
            }
信号量门=新信号量(1);
公开募捐{
while(true){
行动法;
对于(Map.Entry:ActionMap.entrySet()){
if(Gate.tryAcquire());
{
act=((队列)entry.getValue()).poll();
if(act==null){
Gate.Release();
打破
}
否则{
act.handle();
Gate.Release();
}
}
}
}
}
解决这个问题,Gate.aquire()将锁定所有条目 这意味着对于2个不同的条目和2个不同的线程,只有一个线程可以访问门并执行操作

那么,最后有没有人有一个设计模式可以帮助我呢?
谢谢…

您可以使用
java.util.concurrent
类型的映射来实现此目的。它们是线程安全的,因此不需要同步


同步意味着:资源(已同步)不能被多个线程同时修改。e、 集合返回的g映射。synchronizedMap(MAP)将是一个同步映射,可以由一个线程一次修改,但并发集合允许多个线程根据需要在给定时间访问集合的不同部分。e、 g我们有一个ConcurrentHashMap重载构造函数,它将输入ConcurrentyLevel作为可以同时访问集合的线程数。

我有点不能使用并发集合,如果两个线程试图更改集合,其中一个线程必须等待。。。但是在我的例子中,如果两个线程试图更改两个不同的条目,它们不应该等待,这正是并发集合的目的,弄乱相同map=Pif的线程如果两个线程试图获得两个不同的条目,其中一个必须等待,对吗?如果有不同的条目,不。并发不是基于锁的,是基于资源的。ConcurrentHashMap是线程安全的对象。无论有多少线程同时访问它,它都会遵守承诺。但是,如果程序的两个线程在同一时间尝试为同一个键在映射中输入不同的值,那就是数据竞争。当其他线程稍后查找该键时,它得到的值将取决于哪个线程赢得了比赛。如果你只有一个线程扫描地图,并将任务提交给a怎么办?我觉得我的解释不清楚,我给出了两个想法,并说他们没有给我想要的。。。我那样做是为了澄清我的问题。。我不会等待任何人告诉我如何修改我的代码。除此之外,您的解决方案不会有帮助我有条目每个条目都包含队列在此队列中有一个操作线程的任务是查找条目(队列)并执行操作..有一些约束要了解它们您可以阅读上面..我毕竟找到了一个解决方案..它是修改信号量。。。信号量和“syncronized”之间的组合…。无论如何谢谢