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