tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von genodeftest
  • 1 Beitrag von syz
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
1189
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    syz syz ist offline Grünschnabel
    Registriert seit
    Feb 2011
    Beiträge
    3
    Hallo wissende!
    habe ein kleines problem mit meinem ResourcePool der mit Semaphore einige probleme des multithreading lösen soll.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    
    import java.util.Stack;
    import java.util.concurrent.Semaphore;
     
    public class ResourcePool<T> {
        private int MAX_AVAILABLE;
        private Semaphore semaphore;
        private Stack<T> unused = new Stack<T>();
        private Stack<T> used = new Stack<T>();
     
        ResourcePool(Stack<T> stack) {
            unused = stack;
            used.clear();
            MAX_AVAILABLE = unused.size();
            semaphore = new Semaphore(MAX_AVAILABLE, false);
        }
     
        ResourcePool(Stack<T> stack, boolean fair) {
            unused = stack;
            used.clear();
            MAX_AVAILABLE = unused.size();
            semaphore = new Semaphore(MAX_AVAILABLE, fair);
        }
     
        public T acquire() throws InterruptedException {
            System.out.println(Thread.currentThread().getName()+" trying to get access");
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName()+" access granted");
            return get();
        }
     
        protected synchronized T get() {
            T temp = unused.pop();
            used.push(temp);
            return temp;
        }
     
        public void release(T item) {
            System.out.println(Thread.currentThread().getName()+" removing access");
            set(item);
            semaphore.release();
        }
        
        protected synchronized void set(T item) {
            used.remove(item);
            unused.push(item);
        }
        
        public void print() {
            System.out.println("pool inhalt:");
            for (int i=0;i<unused.size();i++) System.out.println(unused.get(i));
        }
    }
    wie man sieht befindet der sich der Pool noch in der enwicklungsphase :P
    Nun zum problem:
    Code java:
    1
    2
    3
    4
    5
    6
    
    Stack<String> stack = new Stack<String>();
    stack.push("test1");
    ResourcePool<String> pool = new ResourcePool<String>(stack);
    String t = pool.acquire();
    t = Thread.currentThread().getName()+" was here!";
    pool.release(t);
    nachdem releasen der variable "t" kann man trotzdem die resource noch manipulieren.
    wie kann man das verhindern?
    anregungen und kritik an der klasse ResourcePool sind erwünscht!
    Danke!
    Geändert von syz (09.02.11 um 17:25 Uhr)
     

  2. #2
    syz syz ist offline Grünschnabel
    Registriert seit
    Feb 2011
    Beiträge
    3
    hat keiner eine idee?
     

  3. #3
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    868
    Ich wüsste nicht, wie du das technisch realisieren kannst. In deinem Fall besteht das Problem aber nicht: Strings sind immutable, können also nicht geändert werden.

    Falls du andere Objekte verwendest, schreib einfach in die JavaDoc, dass man die Elemente nicht verändern darf und hoffe darauf, dass die Nutzer sich daran halten.

    Um die ursprünglichen Objekte zu schützen könntest du auch die Objekte nach dem releasen klonen und das geklonte Objekt zurückgeben. Damit wäre das ursprüngliche Objekt sicher vor Manipulation.
    syz bedankt sich. 
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  4. #4
    syz syz ist offline Grünschnabel
    Registriert seit
    Feb 2011
    Beiträge
    3
    Danke!
    Ich glaube nicht das es so funktionieren wird.
    Hab was interessantes gefunden: (Dynamische) Proxy:
    http://www.gruntz.ch/courses/sem/ws0...oxyKlassen.pdf
    http://www.dpunkt.de/java/Die_Sprach...t_Java/75.html
    Meine das mein Info Dozent davon gesprochen hat, weis es aber nicht genau. Aufjedenfall fiel das wort "Proxy" in verbindung mit dem ResourcePool.
    Werde mich mal in die Proxy geschichte reinknien.
    Falls jemand mit diesen Proxy's bereits Erfahrung gemacht, bitte gebt euren Senf dazu******
    genodeftest bedankt sich. 

  5. #5
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    868
    Danke für die Links, genau das hab ich jetzt grad gebraucht
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

Ähnliche Themen

  1. synchronized run() synchronisiert nicht
    Von Steve222 im Forum Java Grundlagen
    Antworten: 11
    Letzter Beitrag: 27.04.10, 02:22
  2. Frage zu synchronized
    Von M_Kay im Forum Java
    Antworten: 9
    Letzter Beitrag: 10.07.09, 11:58
  3. Schlüsselwort synchronized - 2 Varianten
    Von Klein0r im Forum Java
    Antworten: 1
    Letzter Beitrag: 08.05.08, 00:22
  4. synchronized, wait, notify
    Von PeteProgram im Forum Java
    Antworten: 4
    Letzter Beitrag: 20.06.07, 12:37
  5. static Methoden und synchronized
    Von kleinis_1 im Forum Java
    Antworten: 2
    Letzter Beitrag: 23.12.05, 14:30