/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
synchronized på attributter
Fra : Carsten H. Pedersen


Dato : 30-05-01 08:01

Hvis man i en klasse bruger synchronized på en attribut, betyder det så at
den pågældende attribut er låst i hele klassen? F.eks:

int foo;
a() {
synchronized (foo) {
noget_kode_her;
}
}

b() {
foo = 1;
}

Kan b() gå ind og ændre i foo mens den er synchronized i a()? Og hvis den
kan, hvordan afhjælper jeg så dette problem?

På forhånd tak.


/Carsten




 
 
Brian Matzon (30-05-2001)
Kommentar
Fra : Brian Matzon


Dato : 30-05-01 08:29

"Carsten H. Pedersen" <ged@mail.ikasths.dk> wrote in message
news:9f25t7$qha$1@news.net.uni-c.dk...
> Hvis man i en klasse bruger synchronized på en attribut, betyder det så at
> den pågældende attribut er låst i hele klassen? F.eks:
>
> int foo;
> a() {
> synchronized (foo) {
> noget_kode_her;
> }
> }
>
> b() {
> foo = 1;
> }
>
> Kan b() gå ind og ændre i foo mens den er synchronized i a()? Og hvis den
> kan, hvordan afhjælper jeg så dette problem?

Når man synkronisere på noget, betyder det, at kun en thread instance af
gangen
må bruge det object man synkroniserer. Så i dit tilfælde ville det netop
betyde at
der ikke er andre der kan pille ved foo mens der er en der er inde i din
synchronized statement.
MEN!! Dit eksempel vil ikke virke, da man AFAIK kun kan synkronisere på
objekter...

/Brian Matzon



Morten Primdahl (30-05-2001)
Kommentar
Fra : Morten Primdahl


Dato : 30-05-01 08:21

Brian Matzon wrote:
>
> "Carsten H. Pedersen" <ged@mail.ikasths.dk> wrote in message
> news:9f25t7$qha$1@news.net.uni-c.dk...
> > Hvis man i en klasse bruger synchronized på en attribut, betyder det så at
> > den pågældende attribut er låst i hele klassen? F.eks:
> >
> > int foo;
> > a() {
> > synchronized (foo) {
> > noget_kode_her;
> > }
> > }
> >
> > b() {
> > foo = 1;
> > }
> >
> > Kan b() gå ind og ændre i foo mens den er synchronized i a()? Og hvis den
> > kan, hvordan afhjælper jeg så dette problem?
>
> Når man synkronisere på noget, betyder det, at kun en thread instance af
> gangen
> må bruge det object man synkroniserer. Så i dit tilfælde ville det netop
> betyde at
> der ikke er andre der kan pille ved foo mens der er en der er inde i din
> synchronized statement.

Ikke helt korrekt. Der skal synkroniseres alle steder der skal
garanteres
gensidig udelukkelse.

Object o = new Object();
int foo;

a() {
synchronized(o) {
//noget kode her der retter på foo
}
}

b() {
synchronized(o) {
foo = 1;
}
}

Erstat o med this, og det er samme effekt som hvis metoderne blev
erklærede som synchronized. Synchronized betyder at det man får
'object lock' fra det objekt man synkroniserer omkring. Kun een
process kan have den for hvert objekt. Men man skal eksplicit
sige til en process at den skal tage 'object lock' før den kan
komme videre, før der er sikret "eneret" til de kritiske regioner.

Mvh Morten

--
Morten Primdahl Caput A/S Tel +45 70 12 24 42
morten@caput.com Nygade 6 Fax +45 70 11 24 42
http://www.caput.com/ DK-1164 Kbh K

Brian Matzon (30-05-2001)
Kommentar
Fra : Brian Matzon


Dato : 30-05-01 14:50

> > Når man synkronisere på noget, betyder det, at kun en thread instance af
> > gangen
> > må bruge det object man synkroniserer. Så i dit tilfælde ville det netop
> > betyde at
> > der ikke er andre der kan pille ved foo mens der er en der er inde i din
> > synchronized statement.
>
> Ikke helt korrekt. Der skal synkroniseres alle steder der skal
> garanteres
> gensidig udelukkelse.

*doh!* Ja, selvfølgelig :)

/Brian Matzon



Ulrik Magnusson (30-05-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 30-05-01 10:43

Brian Matzon wrote:

> "Carsten H. Pedersen" <ged@mail.ikasths.dk> wrote in message
> news:9f25t7$qha$1@news.net.uni-c.dk...
> > Hvis man i en klasse bruger synchronized på en attribut, betyder det så at
> > den pågældende attribut er låst i hele klassen? F.eks:
> > int foo;
> > a() {
> > synchronized (foo) {
> > noget_kode_her;
> > }
> > }
> > b() {
> > foo = 1;
> > }
> > Kan b() gå ind og ændre i foo mens den er synchronized i a()? Og hvis den
> > kan, hvordan afhjælper jeg så dette problem?
> Når man synkronisere på noget, betyder det, at kun en thread instance af
> gangen
> må bruge det object man synkroniserer. Så i dit tilfælde ville det netop
> betyde at
> der ikke er andre der kan pille ved foo mens der er en der er inde i din
> synchronized statement.

Det kan de vel godt - ved at tilgå medlemsvariabler eller kalde
ikke-synkroniserede metoder. Men 2 tråde kan ikke udføre
"noget_kode_her;" eller andre kodeblokke, hvor der er
synkroniseret på foo, samtidig - stadig under antagelse af at
foo er et objekt.

Ulrik Magnusson


--
DEUTSCH: You two have some sick sex thing?
BARTON: Sex?! He's a MAN! We WRESTLED!
Barton Fink - Joel and Ethan Coen, 1991
Visit my home page: http://www.geocities.com/ulrikm



Thomas Berg von Lind~ (30-05-2001)
Kommentar
Fra : Thomas Berg von Lind~


Dato : 30-05-01 10:56

> Hvis man i en klasse bruger synchronized på en attribut, betyder det så at
> den pågældende attribut er låst i hele klassen? F.eks:
>
> int foo;
> a() {
> synchronized (foo) {
> noget_kode_her;
> }
> }
>
> b() {
> foo = 1;
> }
>
^

Erklær foo private og lav en set metode der er synchronized og brug kun
denne når du vil sætte foo til en ny værdi. Hermed undgår du at låse
objektet for tråde der bare vil aflæse værdien af foo, mens kun en tråd kan
manipulere foo ad gangen.

private int foo;

public synchronized setFoo(int f){
foo = f;
}

Mvh
Thomas Berg von Linde



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste