Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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

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 - Fatal编程技术网

Java 多线程锁定和通知

Java 多线程锁定和通知,java,multithreading,Java,Multithreading,我开始阅读Java,我正在学习多线程主题。我也是一名C程序员,所以我有C语言线程方面的知识 我正在搜索线程如何在特定对象上相互通信 我发现了这个问题,但我有矛盾 据我所知,synchronized关键字应用了锁定机制的概念。所以,如果我同步了一个对象,然后在这个对象上调用wait,这是否意味着锁将被释放,以便另一个线程访问?如前一链接中的示例所示,一般规则如下: 线程只能在获取同步锁时调用wait或notify 两个线程不能同时运行同步块中的代码。其他线程必须等待以获取锁 如果获取锁的线程调用w

我开始阅读Java,我正在学习多线程主题。我也是一名C程序员,所以我有C语言线程方面的知识

我正在搜索线程如何在特定对象上相互通信

我发现了这个问题,但我有矛盾


据我所知,synchronized关键字应用了锁定机制的概念。所以,如果我同步了一个对象,然后在这个对象上调用wait,这是否意味着锁将被释放,以便另一个线程访问?如前一链接中的示例所示,一般规则如下:

线程只能在获取同步锁时调用wait或notify

两个线程不能同时运行同步块中的代码。其他线程必须等待以获取锁

如果获取锁的线程调用wait,它会自动释放锁。收到通知后,它会尝试再次自动获取锁


看看立方体孔生产者/消费者的例子,它会有所帮助


调用wait时,同步对象上的锁将被释放。请参阅以下Oracle文档摘录。monitor这个词的意思和lock相同

公开最终无效等待 抛出中断异常 使当前线程等待,直到另一个线程调用此对象的notify方法或notifyAll方法。换句话说,此方法的行为与只执行wait0调用完全相同。 当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行

与单参数版本一样,中断和虚假唤醒是可能的,并且此方法应始终在循环中使用:

 synchronized (obj) {
     while (<condition does not hold>)
         obj.wait();
     ... // Perform action appropriate to condition
 }
此方法只能由作为此对象监视器所有者的线程调用。有关线程成为监视器所有者的方式的描述,请参见notify方法


您说您熟悉C语言中的线程

通过想象与每个Java对象关联的隐式p_thread_mutex_t变量和隐式pthread_cond_t变量,可以理解Java的行为

假设我们有个目标,福。让我们使用mfoo来表示想象中的互斥,并使用cfoo来表示想象中的条件变量

synchronizedfoo{…}块锁几乎与此相同:

pthread_mutex_lock(m(foo));
...
pthread_mutex_unlock(m(foo));
唯一的区别是,Java保证在不解锁互斥锁的情况下无法退出同步块。即使。。。抛出异常,互斥锁仍将解锁

那么,你的问题的答案是:


对foo.wait的调用基本上转化为pthread_cond_waitcfoo,mfoo

等待将解锁线程并将其放入等待notifywait的列表中。notifywait/notifywait是最早的多线程API,也是最低级别的API之一。它几乎不再被使用了。我建议您使用过去11年中添加的较新的并发API。我会从Java 8流开始,然后反向工作。只提供指向外部资源的链接并不被认为是一个好答案,因为monitor这个词的意思与lock的意思相同:是的,我想现在是这样的,但回到Java发明时,monitor应该唤起C.a.R.Hoare的监视器的那种感觉,监视器应该是一个具有关联互斥体和一个或多个条件变量的对象,并且该对象的每个方法都应该在互斥体上同步。