假设我有一个同步块,并且说1000个线程同时访问该块,并且一个线程可以访问同步块。其他999个线程将进入等待状态,直到通知他们。 我想知道这999个线程在等待状态中的确切位置。在等待状态期间以及通知它们时,使用哪种数据结构来保存这999个线程,jvm如何选择一个线程来访问同步块。 也是涵盖线程同步和线程监视器的最佳文章。我搜索了它,但仍然混淆了内部同步的实际效果。
由于
答案 0 :(得分:1)
在java线程中user level threads。与内核级别线程不同,这些线程由客户端库管理。该库负责处理这些线程的状态。例如,即使1000个线程中的10个线程正在10个不同的资源上进行处理,并且1个线程进行系统调用,那么(该进程的)所有线程都会被内核阻塞。但是对于用户库,只有一个进行系统调用的线程被阻塞而其他线程处于运行状态。
此外,无法保证哪个线程将获取下一个锁定。如果您想要公平,可以使用ReentrantLock来提供比synchronized块更多的功能。它还有一个可选的公平参数,如果设置为true,则会为等待时间最长的线程提供锁定。