在java中的实例上进行同步

时间:2015-04-27 12:19:24

标签: java synchronization

我有一个名为“Plan”的对象。有一个名为“PlanService”的接口,它提供API来调用“Plan”上的CRUD操作。 PlanServiceImpl是实际在Plan上实现CRUD操作的实现者。

现在我希望以这样的方式同步Plan上的CRUD操作:如果callerA正在调用“createPlan”,则callerB应该在调用callerA创建Plan之前等待,然后再调用该计划上的任何其他操作。

我已经看到了这方面的几个链接,但并不完全理解同步机制之间的差异,如下所述:

http://tutorials.jenkov.com/java-concurrency/synchronized.html

有人可以向我解释哪种方法可以达到目的吗?

2 个答案:

答案 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中会有一个这样的实例。