Wie kann ich dafür sorgen, dass dies funktioniert, ohne dass „synchronisiert“ einen Deadlock verursacht?Java

Java-Forum
Anonymous
 Wie kann ich dafür sorgen, dass dies funktioniert, ohne dass „synchronisiert“ einen Deadlock verursacht?

Post by Anonymous »

Das Problem wird indirekt durch SQLite verursacht, kann aber nicht durch Änderung von Datenbanken oder SQL-Code gelöst werden. Der Deadlock tritt auf der Java-Seite auf; Ich muss dafür sorgen, dass Parking wie ein Monitor funktioniert, ohne dass es zu Konflikten mit der Synchronisierung kommt, was zu einem Deadlock führt. My Parking-Klasse, ein Monitor, bei dem Clients die lendVehicle-Methode aus anderen Threads aufrufen:

Code: Select all

public class Parking{

private final long       parkId;
private final ParkingAPI sqlLayer;
private final Lock       lock = new ReentrantLock();
private final Condition  notEmpty = lock.newCondition();

public Parking( long mparkId, ParkingAPI api){
sqlLayer = api;
parkId = mparkId;
}

long lendVehicle(){
lock.lock();
try{
while(sqlLayer.countVehicles(parkId) == 0)
notEmpty.await();

return sqlLayer.lend(parkId);

} finally{
lock.unlock();
}
}

void giveBackVehicle(long vehicleId){
lock.lock();
try{
sqlLayer.giveBack(vehicleId,parkId);
notEmpty.signal();

} finally{
lock.unlock();
}
}
}
Wenn ich die SQL-Ebene nur mit einem atomaren Zähler verspotte, funktioniert die Klasse. Allerdings muss ich die SQLite-Verbindung vor gleichzeitigem Zugriff schützen. Der Code wird über das DBLayer-Objekt synchronisiert (von allen Klassen gemeinsam genutzt).

Code: Select all

class ParkingQuery implements ParkingAPI{

private final DBLayer connection;

public SQLLayer(DBLayer db){
connection = db;
}

@Override
int lend(long parkId){
synchronized( connection){
return connection.lendVehicleFromPark(parkId);
}
}

@Override
int countVehicles(long parkId){
synchronized( connection){
return connection.countVehiclesQuery(parkId);
}
}

@Override
void giveBack(long vehicleId, long parkId){
synchronized( connection){
connection.giveBackVehicle(parkId, vehicleId);
}
}
}

Code: Select all

synchronized
funktioniert nicht gut mit dem Monitor des Parkplatzes, was zu einem Deadlock führt. Wie kann ich die Funktionalität des Parkens beibehalten, ohne die Synchronisierung in „ParkingQuery“ zu entfernen? Der gleichzeitige Zugriff auf SQLite ist obligatorisch.
Wenn ein Benutzer ein Fahrzeug verleihen möchte, das nicht verfügbar ist, sollte er warten müssen, bis jemand das Fahrzeug zurückgibt.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post