Sono davvero un nuovo a Java concorrenza e sto cercando di attuare le seguenti specifiche:Come possono due thread essere "in" un metodo "sincronizzato"
- Abbiamo un parcheggio che ha qualche park spots
- Ogni auto è rappresentata come una filettatura che cambia continuamente lo stato della vettura da Driving - Parking. Ogni macchina ha il suo posto di parcheggio.
- Quando l'auto è nello stato di parcheggio, tenta di parcheggiare in un punto (non è necessario il suo posto). Se il posto è libero allora parcheggia altrimenti salterà questa fase di parcheggio e tornerà a guidare.
- L'auto rimane sul posto a meno che il proprietario dello spot non voglia parcheggiare.
questa non è la specifica esatta, ma l'unico problema che ho è il seguente:
io non sono in grado di rendere la vettura saltare il turno. Se due auto scelgono gli stessi posti, una viene parcheggiata e l'altra attende che il parco sia libero. Quale non è il bahvior che voglio. La mia prima idea era quella di sincronizzare semplicemente la lettura e scrittura ad una variabile occupata:
class Car implements Runnable {
private CarState state = CarState.driving
run {
while(true) {
switch(state) {
case driving:
System.out.println(this + " driving.");
state = parking;
break;
case parking: Spot s = CarPark.getRandomSpot();
if(s.willingToPark(this)) {
System.out.println(s + " occupied. " + this
+ " skip park turn.");
} else {
s.park(this);
}
state = driving;
}
}
}
}
class Spot {
private boolean occupied = false;
private Car owner = new Car(...);
synchronized boolean willingToPark(Car c) {
if(occupied) {
return true;
} else {
occupied = true;
return false;
}
synchronized void park(Car c) {
System.out.println(c + " parking at " + this);
//don't care how this is implemented, just keep in mind
//that it will enter in a loop until the owner came back.
occupied = false;
}
}
Se corro questo con tre auto, poi mi finirà ad avere car0 un parcheggio a spot1, car1 un parcheggio a spot0 , car2 è in attesa su spot0, perché car1 sta eseguendo il parco di blocchi sincronizzati (Car c). Non capisco come sia possibile che due auto possano parcheggiare nello stesso punto se il willingToPark è sincronizzato.
Grazie
Grazie per la piacevole sorpresa. Quando ho visto il titolo e le frasi di apertura, non mi aspettavo una domanda ben formulata. –
Penso che dovresti avere un riferimento in classe Spot per l'auto che si trova attualmente in quel punto, quindi quando il proprietario di questo spot vuole parcheggiare puoi avvisare l'auto che attualmente è parcheggiata che deve guidare e fare spazio per il proprietario. – Keammoort
puoi mostrare il tuo metodo principale che esegue le auto? come si cambia stato auto? in base alle informazioni fornite non è ovvio il motivo per cui le auto sono bloccate con il metodo willingToPark – AdamSkywalker