Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Dal richiamo di Enrico Letta alla necessità di completare il mercato unico entro il 2028 alla visione di Nokia sul ruolo dell’IA e delle reti intelligenti, il Nokia Innovation Day 2025 ha intrecciato geopolitica e tecnologia, mostrando a Vimercate come la ricerca italiana contribuisca alle sfide globali delle telecomunicazioni
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
OPPO Reno14 F 5G si propone come smartphone di fascia media con caratteristiche equilibrate. Il device monta processore Qualcomm Snapdragon 6 Gen 1, display AMOLED da 6,57 pollici a 120Hz, tripla fotocamera posteriore con sensore principale da 50MP e generosa batteria da 6000mAh con ricarica rapida a 45W. Si posiziona come alternativa accessibile nella gamma Reno14, proponendo un design curato e tutto quello che serve per un uso senza troppe preoccupazioni.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-08-2007, 13:49   #1
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
[Java] synchronization

perché questo codice

class Prova {
public static Object obj = new Object();
public static String s = "0";

public static void main(String[] args) {
// creo 2 thread che eseguano il run di Incrementor
// aspetto che i 2 thread terminino
// stampo il valore di s
}
}

class Incrementor implements Runnable {

public void run() {
for (i = 0; i < 1000000; i++) {
synchronized(Prova.s) {
s = "" + (Integer.parseInt(Prova.s) + 1);
}
}
}

}

porta a un valore finale di s errato mentre se mi sincronizzo su Prova.obj invece che su Prova.s funziona correttamente?
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2007, 14:30   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
porta a un valore finale di s errato mentre se mi sincronizzo su Prova.obj invece che su Prova.s funziona correttamente?
I due thread devono chiaramente sincronizzarsi sullo stesso oggetto (altrimenti la sincronizzazione non avrebbe effetto). Sincronizzarsi su un oggetto referenziato da una variabile static va appunto bene.
Ma il fatto è che mentre il reference obj è e rimane fisso, il reference alla stringa cambia per via della concatenazione! Per tale motivo non va bene.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2007, 14:35   #3
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
mille grazie!
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 15:48   #4
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
synchronized(Prova.s) {
s = "" + (Integer.parseInt(Prova.s) + 1);
}


è la priva volta che vedo questo tipo di codice,ma cosa fa esattamente?
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 15:58   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da nuovoUtente86 Guarda i messaggi
synchronized(Prova.s) {
s = "" + (Integer.parseInt(Prova.s) + 1);
}


è la priva volta che vedo questo tipo di codice,ma cosa fa esattamente?
synchronized è la parola chiave che permette di gestire una "mutua esclusione" tra più thread. Ogni oggetto ha un monitor, di cui un thread può fare il lock e unlock. Solo un thread per volta può acquisire il lock sul monitor. Gli altri eventuali thread che cercano di acquisire il lock su un monitor già lockato, sono bloccati fino a quando viene fatto l'unlock sul monitor.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 16:02   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
la parola chiave "synchronized" stabilisce che il metodo o, nel caso in questione, il blocco di codice è ad accesso mutualmente esclusivo.

Gli esclusi sono i Thread: solo un Thread alla volta può trovarsi all'interno di quel blocco (ad eseguirne il contenuto).

La mutualità è prodotta attraverso un monitor, cioè un valore di controllo che dice "in questo istante sono posseduto da qualcuno". Stile esorcista.

Ai fini della sincronizzazione, ogni Object Java è un monitor. Cioè tutto tranne i primitivi.

Bene, quella forma:

Codice:
synchronized(qualcosa) {

}
Dice che il blocco di codice marcato "synchronized" è ad accesso mutualmente esclusivo e l'esclusione è stabilita usando come monitor "qualcosa". Significa quindi che se un altro Thread detiene il monitor "qualcosa" nessun'altro Thread potrà entrare nel blocco sincronizzato finchè quel Thread non abbia rilasciato il monitor.

Il monitor viene rilasciato automaticamente all'uscita, comunque motivata, dal blocco sincronizzato.

La forma:

Codice:
synchronized {

}
è un'abbreviazione per:

Codice:
synchronized(this) {

}
La forma:

synchronized void unMetodo() {
...contenuto del metodo
}

Equivale a:

Codice:
void unMetodo() {
    synchronized {
        ...contenuto del metodo
    }
}
Nel caso del codice incollato, il monitor è il campo statico s di Prova che vale, a scelta dell'implementazione, null o "s". Idem per obj, che potrebbe valere null o un oggetto.
__________________
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 30-08-2007, 16:03   #7
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da andbin Guarda i messaggi
synchronized è la parola chiave che permette di gestire una "mutua esclusione" tra più thread. Ogni oggetto ha un monitor, di cui un thread può fare il lock e unlock. Solo un thread per volta può acquisire il lock sul monitor. Gli altri eventuali thread che cercano di acquisire il lock su un monitor già lockato, sono bloccati fino a quando viene fatto l'unlock sul monitor.
si ma io l' ho sempre usata sui metodi ma non avevo mai visto questo tipo di utilizzo su una variabile statica.

Poi si discuteva sulla stringa:è ver che con la concatenazione in realtà si passa a referenziare un nuovo oggetto ma non capisco come mai fallisca il metodo.

s all' inizio punterà a "ciao" poi se si concatena punterà ad un nuovo oggetto " ciao ciao" ma perchè si ha il problema sulla sincronizzazione?
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 16:03   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
E be', e dammi una mano andbin! Se mi scrivi quattro righe è chiaro che duplico le risposte! E prenditi un po' di tempo!
__________________
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 30-08-2007, 17:01   #9
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da andbin Guarda i messaggi
Ogni oggetto ha un monitor, di cui un thread può fare il lock e unlock.
il lock su cui gli statement synchronized si sincronizzano credo non c'entri nulla col monitor di un oggetto, che sarebbe invece quello su cui si sincronizzano i metodi wait, notify, notifyAll... sono due meccanismi indipendenti.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 17:08   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
No, è lo stesso monitor.
__________________
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 30-08-2007, 17:12   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
No, è lo stesso monitor.
scusa ma allora bisogna necessariamente usare synchronized prima di chiamare Object.wait ?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 17:14   #12
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da 71104 Guarda i messaggi
scusa ma allora bisogna necessariamente usare synchronized prima di chiamare Object.wait ?
come non detto... adesso ho capito come funziona

a questa domanda tu avresti risposto di si, e io subito dopo avrei chiesto: "ma allora a che serve notifyAll dato che un solo thread alla volta può chiamare wait?", ma ho letto ora che wait rilascia il monitor ^^
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 17:15   #13
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
[edit] ti sei già risposto
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 17:16   #14
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
bisogna chiamare syncronized prima di wait?
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 17:22   #15
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Bisogna invocare wait() all'interno di un blocco sincronizzato sull'oggetto che subisce l'invocazione di wait().

Cioè se:

x.wait();

allora dev'essere:

Codice:
synchronized(x) {
   x.wait();
}
Se l'oggetto è "this" allora si può usare la forma breve:

Codice:
synchronized {
    wait();
}
Ps: ho omesso la gestione delle eccezioni.
__________________
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 30-08-2007, 18:00   #16
pisto
 
Messaggi: n/a
c'è un modo non bloccante per vedere se il monitor di un certo oggetto è già sotto il controllo di un Thread?
  Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 18:12   #17
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
C'è il metodo holdsLock di Thread che però non dice se sia o non sia bloccante, cioè se il controllo sia fatto tentando un'acquisizione del monitor.
__________________
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 30-08-2007, 19:46   #18
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da nuovoUtente86 Guarda i messaggi
si ma io l' ho sempre usata sui metodi ma non avevo mai visto questo tipo di utilizzo su una variabile statica.

Poi si discuteva sulla stringa:è ver che con la concatenazione in realtà si passa a referenziare un nuovo oggetto ma non capisco come mai fallisca il metodo.

s all' inizio punterà a "ciao" poi se si concatena punterà ad un nuovo oggetto " ciao ciao" ma perchè si ha il problema sulla sincronizzazione?
È un problema di grana molto "fine" ma esiste.

All'inizio si ha un oggetto "0". I thread <A> e <B> cercano di ottenere il lock su "0". <A> ad esempio ci riesce ed esegue il blocco, mentre <B> rimane bloccato sempre su "0". <A> crea un nuovo oggetto "1" e cambia il reference. <B> rimane ancora bloccato su "0" (che esiste ancora ... non è sparito). <A> rilascia il lock su "0" e quindi <B> può ottenere il lock su "0" (che era in attesa). Ma intanto 's' è cambiato quindi <A> cerca di fare il lock su "1" e non più "0".
Alla fine della storia che succede? Che ci può essere un istante in cui entrambi i thread entrano nel blocco perché hanno il lock su oggetti diversi. E questo è moooolto pericoloso!


Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
E be', e dammi una mano andbin! Se mi scrivi quattro righe è chiaro che duplico le risposte! E prenditi un po' di tempo!
Sai ... dovremmo metterci d'accordo noi due quando si tratta di rispondere su Java .... che so, fare una risposta cooperativa by andbin & PGI-Bis.

Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Se l'oggetto è "this" allora si può usare la forma breve:

Codice:
synchronized {
    wait();
}
Ehm .. non c'è la forma breve. La parte (Espressione) ci deve sempre essere.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2007, 20:02   #19
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Sì, pardon, intendevo la forma:

Codice:
synchronized void blabla() {

}
anzichè:

Codice:
void blabla {
    synchronized(blu) {

    }
}
__________________
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-12-2007, 15:04   #20
andremosfet
Member
 
Iscritto dal: Dec 2005
Messaggi: 119
scusate ragazzi una domandina..se invoco il metodo wait() lo devo sempre includere in un blocco synchronized??(ovviamente oltre a gestire l'eccezione)
__________________
Meglio?
andremosfet è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
Super sconti del weekend Amazon: 5 novit...
Dreame non si ferma più: tra le n...
Samsung Galaxy Buds3 FE a meno di 95€ su...
Praticamente regalate: 135€ per le Squie...
Si rinnovano i coupon nascosti di settem...
Amazon sconta i componenti: occasioni d'...
Vibe coding: esplode la domanda di esper...
Ring Intercom su Amazon: citofono smart ...
Addio regie complicate: un'AI gestir&agr...
Xbox, nuovo aumento dei prezzi negli Sta...
Adesso ci si può laureare in stor...
Impact.com ridefinisce il performance ma...
Nintendo non considera le mod dannose pe...
Dreame inaugura il suo flagship store a ...
OpenAI e Jony Ive: in arrivo un disposit...
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: 09:20.


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