Ein synchronized Block ausreichend?

Status
Nicht offen für weitere Antworten.

hupfdule

Top Contributor
Angenommen ich habe folgenden Code:

Code:
public class T{
   private List<String> list;

   public void doSomething(){
       synchronized(list){
           //stelle irgendwas mit der Liste an
       }
   }

   public void doSomethingOther(){
       //stelle hier auch etwas mit der Liste an
   }
}

Ist es damit sichergestellt, dass innerhalb von doSomething() die Liste im exklusiven Zugriff ist, selbst zwischenzeitlich ein anderer Thread doSomethingOther() aufruft? Mir geht es halt darum, dass ich nicht überall einen synchronized-Block benötige, daher wäre das in doSomethingOther() nutzlos. Nur innerhalb von doSomething wird halt relativ viel gemacht, wobei sichergestellt sein soll, dass sich die Liste in dieser Zeit nicht ändert.
Ist das mit diesem Konstrukt gegeben oder nicht? Komme mir zwar etwas blöd vor mit der Frage, aber ich bin mir da wirklich nicht ganz sicher, ob der Zugriff auf die Liste auch in doSomethingOther() blockiert wird, wenn jemand gerade doSomething() aufruft.
 

RaoulDuke

Bekanntes Mitglied
Nein, du braucht überall den Synchronized Block um deine Zugriffe auf die Liste.

Du kannst die Liste aber in einen Wrapper einpacken der das synchronisieren regelt, dann brauchst du die Blöcke nicht überall. Siehe: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#synchronizedList(java.util.List)
 

hupfdule

Top Contributor
Hmm, schade. Was wäre denn der geschickteste Ansatz hier mein Ziel zu erreichen. Wohlgemerkt, es gibt noch weitaus mehr Methoden, die auf die Liste zugreifen. Sobald aber doSomething() etwas damit macht, soll die Liste für alle andern gesperrt sein.
 

byte

Top Contributor
Wie RaoulDuke schon sagte: Schreib Dir eine Klasse, die Deine Liste repräsentiert und eine Schnittstelle anbietet, um auf die Liste zuzugreifen. Die Methoden dieser Schnittstelle machst Du synchron. Wenn dann überall ausschließlich diese Methoden für den Zugriff auf die Liste verwendet werden, hast Du keine Probleme mehr.

Oder Du suchst Dir eine Liste aus dem Collection Framework, die schon synchronisiert ist.
 

hupfdule

Top Contributor
Nein, da habt ihr mich missverstanden. Ich will nicht einfach die direkten Zugriffe auf die Liste synchronisieren, sondern einen ganzen Block von Aufgaben. In doSomething() wird bspw. mehrfach über die Liste iteriert, diese verändert, ausgelesen, etc. Während dieser Aufgaben soll sicher gestellt sein, dass sich die Liste nicht ändert. In dem Falle müsste ich ja trotzdem um jeden Zugriff einen synchronized Block schalten, was ich ja vermeiden will. Auch eine bereits synchonisierte Liste hilft mir nichts, weil da ja nur die direkten Zugriffe synchronisiert sind.
 

RaoulDuke

Bekanntes Mitglied
Ja, und für solche Bereiche brauchst du wieder synchronized Blöcke, da kommst du nicht drumrum. Steht ja auch oben in der Doku die ich gepostet habe.
 
S

SlaterB

Gast
man kann hier aber gerne aufpassen, es nicht zu übertreiben,

wenn ein Zugriff synchronized sein muss und 99 andere nicht,
dann sollten sich die 99 anderen nicht gegenseitig blockieren,

Lösung wäre hier ein externes Synchronisieren mit einem Semaphor,
bei dem man sich aber an- und abmelden müsste

in Spezialfällen nicht zu verachten, hier sicherlich unnötig
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J synchronized block mit this und wait() Allgemeine Java-Themen 5
J Synchronized Probleme Allgemeine Java-Themen 7
D ReentrantLock oder Synchronized ? Allgemeine Java-Themen 3
B Threads synchronized Allgemeine Java-Themen 3
OnDemand Threads und synchronized Allgemeine Java-Themen 9
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
E Verständnisfrage zu synchronized-Blöcken Allgemeine Java-Themen 3
J yield() Aufruf in einer synchronized-Methode Allgemeine Java-Themen 13
A Frage zu Synchronized Allgemeine Java-Themen 5
R Synchronized - auf welchem Objekt Allgemeine Java-Themen 16
R synchronized methode rekursiv aufrufen Allgemeine Java-Themen 5
P synchronized Allgemeine Java-Themen 4
S komplexe synchronized bedingungen Allgemeine Java-Themen 6
G synchronized Allgemeine Java-Themen 7
J Threads und synchronized Allgemeine Java-Themen 18
hdi synchronized & volatile Allgemeine Java-Themen 10
G zwei mal synchronized Allgemeine Java-Themen 5
M Verständnis "synchronized" Allgemeine Java-Themen 4
T Thread synchronized Allgemeine Java-Themen 5
Kr0e Synchronized Allgemeine Java-Themen 4
K synchronized und notify / notifyAll Allgemeine Java-Themen 8
G synchronized-Sclüsselwort: welche Reihenfolge zum Betreten? Allgemeine Java-Themen 6
R synchronized "gegen sich selbst" Allgemeine Java-Themen 5
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
R Thread-Problem, und synchronized bringt nix Allgemeine Java-Themen 4
J synchronized (bitte beantworten, urgent! danke) Allgemeine Java-Themen 11
G synchronized Klasse? Allgemeine Java-Themen 6
G synchronized + threads Allgemeine Java-Themen 12
A deadlocks bei synchronized Allgemeine Java-Themen 3
K vector, synchronized und mehrere methoden Allgemeine Java-Themen 3
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
Neumi5694 Lambda - Block vs "Anweisungsliste" Allgemeine Java-Themen 8
I Java Optionals mit return-Block Allgemeine Java-Themen 2
C try-catch Block Verständnisfrage Allgemeine Java-Themen 14
B Sudoku-Block-Prüfung Allgemeine Java-Themen 1
P Threads Objekt im Konstruktor anders wie im Run()-Block Allgemeine Java-Themen 10
C Unendlich Wiederholungsfehler bei try catch - Block Allgemeine Java-Themen 3
T Warum ein privileg block? Allgemeine Java-Themen 0
H Probleme mit finally-Block und close() Allgemeine Java-Themen 4
N String aus Try/Catch-Block übernehen Allgemeine Java-Themen 14
B Execption auf Oberfläche werfen, try-catch-Block Allgemeine Java-Themen 6
G Initialization Block? Allgemeine Java-Themen 8
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
E JNA:Zugriff auf Common-Block von Fortran bzw. Struct in C Allgemeine Java-Themen 2
D break block by label Allgemeine Java-Themen 14
M Konstruktor / statischer Block Allgemeine Java-Themen 13
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
G GC Warning: Repeated allocation of very large block Allgemeine Java-Themen 35
E try/catch Block um ganzes Programm Allgemeine Java-Themen 10
conan2 static-Block in Klassen Allgemeine Java-Themen 6
T rießiger try - catch - Block Allgemeine Java-Themen 13
M System Leistung ausreichend? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben