我有一个名为“Plan”的对象。有一个名为“PlanService”的接口,它提供API来调用“Plan”上的CRUD操作。 PlanServiceImpl是实际在Plan上实现CRUD操作的实现者。
现在我希望以这样的方式同步Plan上的CRUD操作:如果callerA正在调用“createPlan”,则callerB应该在调用callerA创建Plan之前等待,然后再调用该计划上的任何其他操作。
我已经看到了这方面的几个链接,但并不完全理解同步机制之间的差异,如下所述:
http://tutorials.jenkov.com/java-concurrency/synchronized.html
有人可以向我解释哪种方法可以达到目的吗?
答案 0 :(得分:2)
我假设您只想在创建计划时停止其他线程,否则允许多线程访问。这听起来像你正在寻找一个void initViews()
{
// Creating the bitmap of the marker from the resources
Bitmap marker = BitmapFactory.decodeResource(getResources(), R.drawable.marker);
// Creating our database tilesProvider to pass it to our MapView
String path = Environment.getExternalStorageDirectory() + "/mapapp/world.sqlitedb";
tilesProvider = new TilesProvider(path);
// Creating the mapView and make sure it fills the screen
Display display = getWindowManager().getDefaultDisplay();
mapView = new MapView(this, display.getWidth(), display.getHeight(), tilesProvider, marker);
// If a location was saved while pausing the app then use it.
if (savedGpsLocation != null) mapView.setGpsLocation(savedGpsLocation);
// Update and draw the map view
mapView.refresh();
}
,它允许你创建一些区域写因此没有其他线程可以访问,而其他区域读意义没有其他线程可以写。
这样的事情:
ReadWriteLock
此处方法class Plan {
ReadWriteLock creating = new ReentrantReadWriteLock();
public void createPlan() {
// Establish a write lock - no-one else can read or write while I hold this lock.
creating.writeLock().lock();
try {
// Do your creating here.
} finally {
creating.writeLock().unlock();
}
}
public void doSomething() {
// Establish a read lock - no-one else can write while reading in process.
creating.readLock().lock();
try {
// Do your creating here.
} finally {
creating.readLock().unlock();
}
}
public void doSomethingElse() {
// Establish a read lock - other threads can also take a read lock at the same time.
creating.readLock().lock();
try {
// Do your creating here.
} finally {
creating.readLock().unlock();
}
}
}
和doSomething
可以并行运行,但它们将阻止doSomethingElse
正在完成。
答案 1 :(得分:1)
关键问题在于您的服务实例有多少。如果您的服务是单例(应用程序中只有一个实例),那么您可以像这样同步:
public void synchronized createPlan() {
}
由于持有锁的对象在调用方法的任何地方都是相同的。
如果它不是单身,那么你需要一个对象来同步:
public void createPlan() {
synchronized(PlanServiceImpl.class) {
}
}
这通常是class
对象,因为在JVM中会有一个这样的实例。