我有一个关键代码,包含在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;
}
}
}
答案 0 :(得分:5)
同步块不“公平”。无法保证哪个线程在可用时可以进入同步块。
答案 1 :(得分:5)
如果您想引入公平,可以使用ReentrantLock
Lock lock = new ReentrantLock(true);
等待进入关键部分的主题将进入" fair"按顺序排列。
默认的公平政策是"不公平"因为公平性带来了大多数应用程序不需要的性能开销。