mav*_*rav 2 java multithreading synchronized
在Spring源代码中找到了这段代码.这是将XML文件转换为Bean Tree的第一步.
/** Synchronization monitor for the "refresh" and "destroy" */
private final Object startupShutdownMonitor = new Object();
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
}
Run Code Online (Sandbox Code Playgroud)
这个习惯用于更精细的级别同步.以下是Java教程的摘录.你本可以使用synchronized(this)但是已经锁定了整个对象.
同步语句对于通过细粒度同步提高并发性也很有用.例如,假设类MsLunch有两个从不一起使用的实例字段c1和c2.必须同步这些字段的所有更新,但没有理由阻止c1的更新与c2的更新交错 - 这样做会通过创建不必要的阻塞来减少并发性.我们创建两个对象仅用于提供锁,而不是使用同步方法或以其他方式使用与此关联的锁.
public class MsLunch {
private long c1 = 0;
private long c2 = 0;
private Object lock1 = new Object();
private Object lock2 = new Object();
public void inc1() {
synchronized(lock1) {
c1++;
}
}
public void inc2() {
synchronized(lock2) {
c2++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
从Java 5开始,java引入了Lock抽象,提供了更多功能.因此,您可以执行类似下面的操作,而不是synchronized(obj).在这里阅读更多细节
Lock lock = new ReentrantLock();
lock.lock();
c1++;
lock.unlock();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1199 次 |
| 最近记录: |