Java MultiThreading - 一个线程在其他线程之前两次进入临界区

Nat*_*ati 3 java multithreading thread-safety

我有一个关键代码,包裹在里面synchronized (this) {}.

在日志中,我看到线程#1进入临界区,然后线程#2到达那里,然后等待,然后,线程#1离开临界区,再次进入它(2ms之后)!甚至在其他线程进入之前.

这怎么可能 ?没有线程#2应该进入临界区?

编辑:

添加我班级的一部分......

@Service
public class RequestService {

    Logger logger = LoggerFactory.getLogger(RequestService.class);

    public HttpResponse executeRequest(HttpClient httpClient, HttpGet request) throws IOException, InterruptedException {
        logger.info("About to enter critical code");
        synchronized (this) {
            logger.info("executing http request");
            HttpResponse response = httpClient.execute(request);
            logger.info("got http response");
            return response;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

jta*_*orn 5

同步块不"公平".当可用时,无法保证哪个线程能够进入同步块.

  • 你问为什么Java没有最大化争用.这是因为争论很糟糕.我们希望尽可能多地完成工作,而无需切换线程,因此我们可以为相同数量的线程切换完成更多工作.交替显然是最糟糕的情况.如果你必须在一家商店买5件东西,在另一家商店买5件东西,你从第一家商店拿起一件东西然后去另一家吗? (2认同)

Sle*_*idi 5

如果你想引入公平,你可以使用ReentrantLock,

Lock lock = new ReentrantLock(true);
Run Code Online (Sandbox Code Playgroud)

等待进入临界区的线程将按照它们排队的顺序以"公平"的顺序输入.

默认的公平性策略是"不公平的",因为公平性带来了大多数应用程序不需要的性能开销.