假设我有一个同步块,并且说 1000 个线程同时访问该块,一个线程可以访问同步块。其他 999 个线程将进入等待状态,直到收到通知。我想知道这 999 个线程处于等待状态的具体位置。在等待状态下使用哪种数据结构来保存这 999 个线程,一旦收到通知,jvm 如何选择一个线程来访问同步块。还有任何涵盖线程同步和线程监视器的最佳文章。我用谷歌搜索了它,但仍然对同步在内部的实际工作方式感到困惑。
谢谢
假设我有一个同步块,并且说 1000 个线程同时访问该块,一个线程可以访问同步块。其他 999 个线程将进入等待状态,直到收到通知。我想知道这 999 个线程处于等待状态的具体位置。在等待状态下使用哪种数据结构来保存这 999 个线程,一旦收到通知,jvm 如何选择一个线程来访问同步块。还有任何涵盖线程同步和线程监视器的最佳文章。我用谷歌搜索了它,但仍然对同步在内部的实际工作方式感到困惑。
谢谢
在 java 中,线程是用户级线程。与内核级线程不同,这些线程由客户端库管理。这个库负责处理这些线程的状态。例如,即使 1000 个线程中有 10 个线程正在处理 10 个不同的资源,并且其中 1 个线程进行系统调用,那么(该进程的)所有线程(该进程的)相对于内核都会被阻塞。然而,对于用户库,只有一个进行系统调用的线程被阻塞,而其他线程处于运行状态。
也不能保证哪个线程将获得下一个锁。如果你想要公平,你可以使用ReentrantLock,它提供了比同步块更多的功能。它还有一个可选的公平参数,如果设置为 true,将为等待时间最长的线程提供锁定。