Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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_Concurrency - Fatal编程技术网

Java 信号量:在一个线程中获得的许可可以从另一个线程中释放-例如

Java 信号量:在一个线程中获得的许可可以从另一个线程中释放-例如,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在考虑一个语句“在一个线程中获取许可证并从另一个线程中发布”的示例 我对信号量的理解是,它维护一组许可证。螺纹在通过临界截面前应获得许可证,然后许可证递减1。一旦螺纹完成临界截面,它将释放许可证,许可证将增加一个。 示例: 1.ATM机,配备一名保安,根据机器的可用性允许人们使用。许可证上有多少台机器就有多少台。一位客户购买了一台ATM机,完成后将其释放。 2.在银行的柜台,如果柜台空闲,客户会收到通知,然后他/她可以去柜台与柜台的主管交谈并完成工作。有多少柜台就有多少许可证 那么,一个线程

我正在考虑一个语句“在一个线程中获取许可证并从另一个线程中发布”的示例

我对信号量的理解是,它维护一组许可证。螺纹在通过临界截面前应获得许可证,然后许可证递减1。一旦螺纹完成临界截面,它将释放许可证,许可证将增加一个。
示例:
1.ATM机,配备一名保安,根据机器的可用性允许人们使用。许可证上有多少台机器就有多少台。一位客户购买了一台ATM机,完成后将其释放。
2.在银行的柜台,如果柜台空闲,客户会收到通知,然后他/她可以去柜台与柜台的主管交谈并完成工作。有多少柜台就有多少许可证


那么,一个线程获取的许可证被另一个线程释放的简单场景/示例是什么呢?

您的ATM示例很好。假设客户通过一扇门进入,然后通过另一扇门离开,每个门都由一个线程管理

或者,举一个更典型的例子,假设到数据库的连接数量有限。线程必须等待开始处理请求,直到它连接到数据库。然后该线程向数据库发送一个请求。但是,在得到数据库的回复之前,您无法取得任何进一步的进展。强制线程等待数据库的回复,以便拥有数据库连接的同一线程可以释放它,这有意义吗

当接收到数据库回复时,让任何正在运行的线程来处理它更有意义。然后,该线程可以释放该连接,而不管在获取该连接的所有权时哪个线程正在运行

抽象地思考一下这个模型:
1.线程拥有资源的所有权。
2.线程使用资源。
3.线程释放资源的所有权

这很好,但是如果第2步由多个线程处理会更好呢?然后,确保步骤3由与步骤1相同的线程执行就成了额外的工作