Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Con 22 tasti, il pulsante 5D, lo Shift Mode e il sensore PixArt 3395 da 26.000 DPI, il nuovo mouse wireless di Mad Catz si rivolge in modo preciso ai giocatori di MMO e RPG. Ma chi conosce già il R.A.T. 8+ ADV si accorgerà subito di quanto i due prodotti condividano, e di dove invece divergono
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC
Abbiamo provato la Gigabyte Radeon RX 9070 GRE Gaming OC, nuova proposta RDNA 4 che si inserisce tra GeForce RTX 5060 Ti e RTX 5070. Prestazioni solide in rasterizzazione e ray tracing, frequenze elevate grazie all'overclock di fabbrica e raffreddamento efficace: ecco come si comporta nei nostri test.
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare
Con tripla lente, tracking sincronizzato, visione notturna a colori e controllo locale senza abbonamenti, la OMVI 3i WiFi porta la sicurezza domestica a un livello molto più moderno, ma senza trasformarla in un sistema complicato da installare o usare
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 31-08-2007, 12:45   #21
faretto
Member
 
L'Avatar di faretto
 
Iscritto dal: Jan 2005
Messaggi: 81
Quote:
Originariamente inviato da roby1483 Guarda i messaggi
In realta' credo che in questo caso ritorni sempre null perche' p non viene mai inizializzato a qualcosa di diverso.
Ma aspetta che ti risponda PGI-Bis perche' come puoi vedere dai miei post non c'ho capito molto neanche io

EDIT:
Credo di aver detto una cavolata.
Credo che getX non ritorni mai null perche' quando p e' null ritorni una nuova istanza di Pippo che avra' x="pippo".

Ma anche questo non prenderlo per oro colato, mi sto' intrippando il cervello con questa concorrenza
infatti, prima di aver letto quanto scritto da PGI-bis, mi sarei aspettato di ottenere sempre come risultato "pippo", ma forse non e' cosi'.

Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
L'apposizione del modificatore synchronized esclude che due Thread possano eseguire in concorso il metodo marcato synchronized. Ha anche un effetto simil-volatile, cioè se un Thread scrive un valore in un campo all'interno di un blocco sincronizzato deve anche aggiornare il corrispondente valore condiviso.
scusa se mi inserisco ancora, ma tu cosa intendi qui per "valore condiviso", visto che hai detto prima che ogni frame ha una propria copia delle variabili?
faretto è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 12:59   #22
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
E' condiviso perchè tutti i Thread possono accedervi. Probabilmente sarebbe meglio "condivisibile" ma il termine delle specifiche è quello.

Attenzione a non cadere nell'eccesso opposto, cioè "se una cosa non è volatile allora questo codice non è thread-safe".

Le norme che stabiliscono cosa sia visibile e cosa non lo sia sono più d'una. Tendono anche al complicato ma è un complicato che, in un certo senso, semplifica.

Faccio un esempio.

Codice:
class Pippo {
    private String value = "hello";

    public String getValue() {
        return value;
    }
}
Codice:
public static void main(String[] args) {
    final Pippo pippo = new Pippo();
    new Thread() { public void run() {
        String x = pippo.getValue();
    }}.start();
}
Qui ci sono due Thread: il Main, che esegue l'inizializzazione di pippo e quindi l'assegnamento value = "hello", e un altro Thread che legge il valore del campo "value" dello stesso pippo.

Non c'è volatile, non c'è synchronized e tuttavia è garantito che il secondo Thread leggerà "hello". Lo è perchè c'è una regola che dice che l'azione che avvia un Thread è sincronizzata con la prima azione contenuta nel metodo run di quel Thread e c'è una regola che dice che le azioni in uno stesso Thread sono sincronizzate.

Insomma, c'è una sorta di rispetto dell'evidenza.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 13:30   #23
faretto
Member
 
L'Avatar di faretto
 
Iscritto dal: Jan 2005
Messaggi: 81
scusa se continuo a rompere, ma adesso mi si e' sollevato il dubbio e preferirei togliermelo.
dal tuo discorso penso di aver capito che con "condiviso" tu intenda entita' esterne al metodo run, mentre prima pensavo tu ti riferissi a variabili locali del metodo run.
detto questo, non sono ancora sicuro di aver capito se il codice che ho postato prima sia un esempio corretto di quanto dicevi in precedenza. vedendo il caso che hai appena riportato, mi verrebbe da dire di si', ma se mi potessi dare la conferma sarebbe meglio

grazie mille e scusa ancora per il disturbo
faretto è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 13:43   #24
roby1483
Senior Member
 
L'Avatar di roby1483
 
Iscritto dal: Apr 2000
Città: S.Croce s/Arno - Pisa - Toscana
Messaggi: 1015
Adesso la cosa e' piu' chiara. Effettivamente e' giustissimo il discorso sul synchronized dei metodi ma segui questo esempio e la successiva domanda.
Io ho sempre la mia servlet fatta cosi:
Codice:
public class MiaClasseServizio extends RemoteServiceServlet {
   private volatile DBHandler db = null;

   public void init() {
      db = new DBHandler(...);
   }

   public void servizioUno() {
      ResultSet rs = null;
      rs = db.executeQuery(...);
      
      faccioQualcosa();
      
      int esito = db.executeUpdate(...);

      if(esito==1)
         db.commit();
      else
         db.rollback();
   }

   public void destroy() {
      db.close();
   }
}
Se ho due Thread che accedono contemporaneamente al metodo di servizio la sincronizzazione offerta dalla keyword "volatile" mi garantisce che se il primo Thread viene interrotto tra la select e l'update il secondo Thread non avra' accesso alla risorsa condivisa (DBHandler) fino a che il primo non avra' terminato di usare la risorsa? Se cosi' fosse come fa la JVM a capire questa cosa senza un blocco synchronized?
__________________
Il mio album su Flickr :: Video Laurea Honoris Causa ad Alan Kay, Universita' di Pisa :: Thinking Different, PowerBook G4 12" 1GHz, iMac Core 2 Duo 20"
roby1483 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 13:58   #25
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
No.

Ricorda che un riferimento in Java è un puntatore. Cioè è una variabile che contiene un numero, null'altro. La "volatilità" si riferisce a quel numero. Volatile ti dice che se un thread cambia quel valore da 25 a 26 una successiva lettura vedrà 26. Trattandosi di puntatori, qui intendo 25 e 26 come indirizzi di memoria putativi.

Opera cioè rispetto al reindirizzamento del puntatore. Non esclude che due Thread possano leggere insieme quel valore. Poichè in Java la lettura di un puntatore avviene solo al fine di accedere ai metodi dell'oggetto puntato, ciò significa che, a prescindere dalla volatilità, due Thread possono invocare contemporaneamente uno stesso metodo di quel DBHandler.

Volatile non comporta mutua esclusione.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 14:14   #26
roby1483
Senior Member
 
L'Avatar di roby1483
 
Iscritto dal: Apr 2000
Città: S.Croce s/Arno - Pisa - Toscana
Messaggi: 1015
Quindi a questo punto devo per forza mettere i metodi di servizio synchronized altrimenti posso avere accessi concorrenti alla connessione. O mi sbaglio anche stavolta?
__________________
Il mio album su Flickr :: Video Laurea Honoris Causa ad Alan Kay, Universita' di Pisa :: Thinking Different, PowerBook G4 12" 1GHz, iMac Core 2 Duo 20"
roby1483 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 14:17   #27
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
E' giusto. E' una soluzione radicale, ma è giusto.

Ma se trasferisci la sincronizzazione ai metodi di DBHandler fai in modo che il codice eseguito in mutua esclusione sia solo quello che effettivamente interagisce con il database. Anche perchè immagino che il metodo di servizio non conterrà solo qualche invocazione ai metodi di DBHandler.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 14:22   #28
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
x faretto

Sottolineo che qualsiasi dubbio dovrebbe essere risolto facendo riferimento al capitolo 17.4 delle specifiche del linguaggio di programmazione Java.

I campi sono condivisi. Le variabili locali non sono condivise. Es:

Codice:
public class Pippo {
    private String campo = "ciccio";

    public void metodo() {
        String variabileLocale = "qualcosa";
    }
}
"campo" è condiviso, nel senso che è memorizzato nella regione di memoria condivisa dai Thread (l'heap). Quando un Thread esegue un metodo che contiene un riferimento a campo, se quella è la prima volta che incontra campo, crea una copia locale di campo. Poi lavora su quella copia. In linea di principio, le modifiche che il Thread compie a quella copia non saranno mai scritte sulla variabile originale, quella che risiede nella memoria condivisa.

Il codice che hai incollato mi pare un po' strano perchè p è sempre null. Per un refuso, immagino.

Comunque, supponiamo che ci sia scritto "return (x = new Pippo())", cioè che il singleton sia creato "pigramente".

x potrebbe essere null. Non essendo volatile, il Thread che inizializza il singleton è libero di non scrivere mai sull'originale il valore "pippo".

Anche il singleton (p) potrebbe essere null.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 14:27   #29
faretto
Member
 
L'Avatar di faretto
 
Iscritto dal: Jan 2005
Messaggi: 81
perfetto, allora pare che abbia capito correttamente

ovviamente il codice era sbagliato, prima di postarlo l'ho modificato, e da bravo fesso ci ho piazzato un errore

grazie ancora per la disponibilita'
faretto è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 14:37   #30
roby1483
Senior Member
 
L'Avatar di roby1483
 
Iscritto dal: Apr 2000
Città: S.Croce s/Arno - Pisa - Toscana
Messaggi: 1015
Si e' vero pero' non sapendo come funziona internamente l'oggetto Connection ho pensato che se sincronizzo tutto il blocco fino al commit/rollback sicuramente i vari Thread non si influenzano tra di loro.
Se pero' mi dici che posso sincronizzare senza problemi i metodi di DBHandler lo faccio volentieri.
In DBHandler ho fondamentalmente questi due metodi:
Codice:
public PreparedStatement getPreparedStatement(String sql) throws DBHandlerException {
   PreparedStatement pst = null;
   try {
      pst = conn.prepareStatement(sql);
   } catch (SQLException e) {
      Logger.logError(this.getClass().toString(), "Impossibile recuperrare il PreparedStatement.");
      throw new DBHandlerException("Impossibile recuperrare il PreparedStatement.");
   }
   return pst;
}
Codice:
public ResultSet executeQuery(String sql) throws DBHandlerException {
   ResultSet rs = null;
   try {
      rs = conn.createStatement().executeQuery(sql);
   } catch (SQLException e) {
      e.printStackTrace();
      Logger.logError(this.getClass().toString(), "Impossibile eseguire la query.");
      throw new DBHandlerException("Impossibile eseguire la query.");
   }
   return rs;
}
conn e' la variabile d'istanza della connessione aperta nel costruttore.
Dici che posso sincronizzare questi e lasciare i metodi di servizio della servlet non sincronizzati?
__________________
Il mio album su Flickr :: Video Laurea Honoris Causa ad Alan Kay, Universita' di Pisa :: Thinking Different, PowerBook G4 12" 1GHz, iMac Core 2 Duo 20"
roby1483 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2007, 17:27   #31
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Guarda, la soluzione che adotterei io è creare un DAO, vale a dire un oggetto che astrae il concetto di base dati ed espone unicamente i metodi necessari alla specifica applicazione.

Ad esempio se le operazioni che devi fare sono salvare un Record, aggiornare un Record, eliminare un Record, cercare un Record, il DAO diventa una cosa tipo:

Codice:
public class DAO {
    public synchronized void open() {...}
    public synchronized void close() {...}
    public synchronized long saveRecord(RecordData r) {...}
    public synchronized void updateRecord(long id, RecordData rd) {...}
    public synchronized void deleteRecord(long id) {...}
    public synchronized Collection<Record> findRecord(RecordData r) {...}
}
I dettagli relativi alla creazione ed all'esecuzione degli statement restano all'interno del DAO, così come privata è la gestione della connessione. La sincronizzazione esclude il concorso nell'esecuzione degli statement coi quali recuperi le informazioni dalla base dati.

Se prendi la connessione e gli tiri fuori un ResultSet tout-court altro non fai che spostare l'esigenza della mutua esclusione da DBHandler al codice che usa DBHandler perchè nè result-set nè statement sono di per sè adatti all'uso concorrente. Dobbiamo infatti ricordare che anche la scansione dei risultati contenuti in un ResultSet può tradursi nell'esecuzione di ulteriori operazioni sulla base dati.

D'altro canto la sincronizzazione è sufficiente per il primo metodo, quello che crea un PreparedStatement.

Insomma, si può fare anche così ma a me sembra più complicato rispetto al DAO "classico".
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 03-09-2007, 07:46   #32
roby1483
Senior Member
 
L'Avatar di roby1483
 
Iscritto dal: Apr 2000
Città: S.Croce s/Arno - Pisa - Toscana
Messaggi: 1015
Ti ringrazio davvero tanto per il tuo aiuto e la tua pazienza.
__________________
Il mio album su Flickr :: Video Laurea Honoris Causa ad Alan Kay, Universita' di Pisa :: Thinking Different, PowerBook G4 12" 1GHz, iMac Core 2 Duo 20"
roby1483 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC Radeon RX 9070 GRE, AMD la porta in tutto il mon...
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare Reolink OMVI 3i WiFi: videosorveglianza pi&ugrav...
Recensione Vivo X300 Ultra: fotocamera eccezionale, ma prezzo proibitivo Recensione Vivo X300 Ultra: fotocamera ecceziona...
Xiaomi 17T Pro recensione: zoom Leica 5x e batteria silicio-carbonio per l'alternativa ai top Xiaomi 17T Pro recensione: zoom Leica 5x e batte...
Cryorig svela Lull, case con radiatore i...
Plaud Team, la soluzione di trascrizione...
OmniBook Ultra 16 e OmniBook X 14, anche...
G.SKILL porta al Computex 2026 una serie...
Biwin al Computex 2026: RAM DDR5 Origin ...
Dimenticatevi OS e app, per Microsoft ci...
Arctic al Computex 2026: Freezer 61, ven...
Siamo stati nel quartier generale di MSI...
AIO senza pompa: Enermax presenta il fut...
3 mesi gratis di Google AI Pro: ecco la ...
realme 16 5G: ufficiale la data di lanci...
GeForce RTX 5060 a poco più di 30...
Microsoft Build 2026, tutte le novit&agr...
Tomb Raider: Legacy of Atlantis, il rema...
NZXT H6 case e ventole Ultra RGB: New De...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:29.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v