Hej igen - enten taler vi meget forbi hinanden, eller også er vi bare slet ikke enige her.
Lad mig begynde med det sidste: Indkapsling har da i høj grad noget med samtidighedsproblemer at gøre. Hvis du kan indkapsle al tilgang til de kritiske områder i din types metoder, kan du jo netop være helt sikker på, at låsning sker på veldefinerede steder og dermed er det langt lettere at undgå deadlocks.
Hvis man omvendt - som du foreslår - tillader låsning på et offentlig objekt, har du ikke en chance for at vide hvem, der kunne finde på at låse på dette, og du er nødt til at se al din kode igennem for at finde låse. Til lukkede applikationer kan man måske gøre, som du foreslår, men hvis man som jeg laver frameworks, er det en virkelig dårlig ide ikke at have styr på, hvor der bliver låst. Og for applikationer ville jeg også foretrække at reducere, hvor der bliver låst.
Så skriver du desuden, at det er helt idioti at ville låse på en value type. Jeg har ingen interesse i at låse på en value type, men hvis man skal følge dit forslag om at låse på det objekt, man vil tilgå er det jo påkrævet, så lad os tage den.
For det første ser jeg intet odiøsst i at det er value types, der indeholder den tilstand, vi ønsker at opdatere og dermed sikre uddelt adgang til. Det kan f.eks. være en int. Har vi kun en af disse er Interlocked naturligvis oplagt, men den sikrer kun uddelt adgang til en enkelt variabel. Skal vi således opdatere to ints som en sammenhængende operation, har vi brug for noget mere. Her kan man naturligvis låse på this, men som nævnt er det med risiko for at andre har gjort det samme og dermed med risiko for deadlock.
Hvis du omvendt opretholder indkapsling, kan du placere dine låse der og så vil det være mere oplagt at bruge en intern instans som beskrevet i mit oprindelige indlæg.
Jeg kan godt blive lidt i tvivl om din forståelse af lock, når du skriver "og det er et absolut must at man kan angive explicit hvad der skal lockes på" - det objekt, man låser på, har absolut ingen indflydelse på låsningen. Objektet er blot en token. Det svarer til forsamlingshusprincippet med at den, der har mikrofonen har ret til at tale. Der er intet andet i det.
Hvis du har en type med to eller flere områder, der skal beskyttes i forskellige sammenhæng, er this desuden et dårligt valg, da den begrænser samtidigheden. Ved at have eksplicitte låse tilknyttet de forskellige områder opnås større samtidighed. Indrømmet er der en stor chance for at dette burde være to klasser, men ideen er god nok.
Tag evt. et kig på
http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601 for en gennemgang af låse og indkapsling.
Brian