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

时间:2016-03-03 21:00:38

标签: 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;
        }
    }
}

2 个答案:

答案 0 :(得分:5)

同步块不“公平”。无法保证哪个线程在可用时可以进入同步块。

答案 1 :(得分:5)

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

Lock lock = new ReentrantLock(true);

等待进入关键部分的主题将进入" fair"按顺序排列。

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