Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JAVA] sincronizzazione di blocco

    Salve a tutti,
    sto studiando, come da titolo, la sincronizzazione di blocco. Ma non riesco a capirla, e non trovo esempi calzanti sul web. Ho capito i metodi sincronizzati, ovvero accessibili da un solo thread alla volta, come ho capito lo svantaggio che porta una notifyAll(), a livello di prestazioni. Ma non riesco a impostare il mio programma usando questo costrutto della sincronizzazione su un oggetto. Faccio un esempio. Ci sono 4 thread A, B, C, D. A e B producono oggetti, svegliano D, il thread distributore, e appena hanno prodotto si sospendono. D, svegliato, sveglia a sua volta C e si sospende a sua volta. C consuma, e appena ha fatto notifica D, che a sua volta sveglia A e B. Ecco, con i semafori torna tutto molto tranquillamente, ma se volessi fare una sincro di blocco, per esempio su un array di Object (state[4], ogni stato corrisponde a un thread, e fare wait e notify direttamente su state[i]), come lo posso impostare? scusate ma non avendo un esempio mi riesce difficile immaginarlo e capirlo.
    vi ringrazio tutti
    gioia

  2. #2
    Dovresti strutturare il tuo programma diversamente. Il blocco synchronized semplicemente è un "insieme d'istruzioni" che non può essere acceduto da piu' di un thread. Si creera' una queue di thread e man mano, in fila (o per priorità), i thread accederanno a quel blocco.

    Dal tuo esempio non ho capito cosa dovrebbe fare il tuo programma. Cioè la sincronizzazione la usi per non permettere a piu' thread di accedere contemporaneamente allo stesso blocco di codice. Quindi se questo è il ragionamento, per usarla i tuoi thread A,B,C e D dovrebbero fare la stessa operazione, e con synchronized puoi gestire la concurrence.
    lolide
    Java Programmer

    Informati

  3. #3
    Hai ragione, ma la sincronizzazione si usa anche per far si che mentre un thread sta eseguendo il suo codice, gli altri non possano eseguire il proprio, quindi come un semaforo, anche se i codici sono diversi. ti spiego: io vorrei che i thread A e B iniziassero a produrre gli elementi, appena hanno finito dovrebbero fare una notify solo al thread D, che era in waitSet. appena D si sveglia, a sua volta sveglia il thread C, che era sospeso. insomma io vorrei usare un vettore tipo state[4] che funzioni in questo modo: A e B si sincronizzano sull'oggetto state[0] e state[1], e poi fanno una notify su state[3] (che è l'oggetto associato al thread D). però non ho ben capito come funziona questa cosa. non voglio il metodo public synchronized void someMethod(), bensì vorrei usare un metodo non sincronizzato con al suo interno un synchronized(state[i]) {}, cioè il lock non è associato a tutto un metodo ma solo a un oggetto. cosi non bisogna usare la notifyAll(), ma basta una state[i].notify(). non so se mi sono spiegata....

  4. #4
    Originariamente inviato da jojo_punky89
    Hai ragione, ma la sincronizzazione si usa anche per far si che mentre un thread sta eseguendo il suo codice, gli altri non possano eseguire il proprio, quindi come un semaforo, anche se i codici sono diversi. ti spiego: io vorrei che i thread A e B iniziassero a produrre gli elementi, appena hanno finito dovrebbero fare una notify solo al thread D, che era in waitSet. appena D si sveglia, a sua volta sveglia il thread C, che era sospeso. insomma io vorrei usare un vettore tipo state[4] che funzioni in questo modo: A e B si sincronizzano sull'oggetto state[0] e state[1], e poi fanno una notify su state[3] (che è l'oggetto associato al thread D). però non ho ben capito come funziona questa cosa. non voglio il metodo public synchronized void someMethod(), bensì vorrei usare un metodo non sincronizzato con al suo interno un synchronized(state[i]) {}, cioè il lock non è associato a tutto un metodo ma solo a un oggetto. cosi non bisogna usare la notifyAll(), ma basta una state[i].notify(). non so se mi sono spiegata....
    Il problema è esattamente questo: che con synchronized non puoi dare accesso esclusivo a quel thread. Puoi passargli l'oggetto state in quel modo, ma poi non puoi gestire solo con synchronized il fatto che solo un thread possa accedere a quel codice.
    lolide
    Java Programmer

    Informati

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.