2016-05-25 14 views
2

Die Zählervariable gibt nicht genau wieder, wie oft das Inkrement Methode aufgerufen wird. Warum nicht, und wie kann es behoben werden? (Sie müssen keinen Code schreiben, nur Englisch verwenden.)Java-Multi Threading-Semaphor

Original:

import java.util.*; 
import java.lang.*; 
import java.io.*; 


class Foopadoop 
{ 
public static int counter = 0; 
public static void main(String[] args) throws Exception { 
    Runnable r = new Runnable() { 
     public void run() { 
      while(true){ 
       counter++; 
      } 
     } 
    }; 
    Thread t1 = new Thread(r); 
    Thread t2 = new Thread(r); 
    t1.start(); 
    t2.start(); 
} 
} 

Mine, Ich habe eine Semaphore, aber ich bin nicht sicher, ob ich es richtig mache oder ich bin nehme an, ein Schloss zu benutzen.

import java.util.*; 
import java.lang.*; 
import java.io.*; 
import java.util.concurrent.Semaphore; 

class Foopadoop 
{ 
public static int counter = 0; 
Semaphore lock = new Semaphore(0); 
public static void main(String[] args) throws Exception { 
    Runnable r = new Runnable() { 
     try{public void run() { 
      while(true){ 
       counter++; 
       lock.acquire(); 
      } 
     } 
     }finally{ 
     lock.release(); 
     } 
    }; 
    Thread t1 = new Thread(r); 
    Thread t2 = new Thread(r); 
    t1.start(); 
    t2.start(); 
} 
} 

Antwort

3

Das ist nicht, wie man eine Semaphore verwenden.

Sie erwerben, bevor Sie die freigegebene Ressource zugreifen, und lassen Sie es nach:

while (true) { 
    try { 
    lock.acquire(); 
    counter++; 
    } finally { 
    lock.release(); 
    } 
} 

Da Sie acquire erste, müssen Sie auch mindestens 1 erlauben, sonst gibt es nichts zu acquire ist:

static Semaphore lock = new Semaphore(1); 

synchronized A-Block ist einfacher als ein Semaphore:

while (true) { 
    synchronized (Foopadoop.class) { 
    counter++; 
    } 
} 

oder Atomicinteger:

static AtomicInteger counter = new AtomicInteger(); 

// ... 

while (true) { 
    counter.getAndIncrement(); 
} 
+0

Wenn Sie es erklären waren, warum die Sache es nicht funktionieren würde - Ist der Code falsch, weil die Fäden 0 Multi Initialisierung des Thread so counter = sind; aber die Methode lief zweimal? – Kappa

+1

Nein, es ist falsch, weil Sie auf die freigegebene Ressource zugreifen, bevor Sie den Semaphor erwerben. Der Punkt des Semaphors besteht darin, einen gegenseitig exklusiven Zugriff auf die Variable zu erzwingen. Und auch, weil Sie mehrere Male vor der Veröffentlichung erwerben. Und weil Sie versuchen, einen Semaphor ohne Erlaubnis zu erwerben. –

+0

Ich meine die ursprüngliche Frage, nicht meine Ausgabe des Codes. – Kappa