3线程锁定

问题描述:

我不明白我的错误,我会描述它,然后我会发布我的代码。 从main()我想运行3个线程(每个线程包含3个女性的循环)。 我有一种方法可以打印出每个进入洗手间的女人和每个出门的女人。我想要使用锁,因此每个线程中的每个女人都会在下一个线程发生之前写入每一个线程。输出应该是这样的: 女人0进入浴室 女人0离开浴室 女人1进入浴室 女人1分离开浴室 女人2进入浴室 女人2分离开浴室 ,然后2倍为每个线程。 我的问题是,只有一个线程正在写入,2个没有达到我释放锁之后仍在等待的锁。 这里是我的代码:(卫浴类)3线程锁定

private Lock lockW=new ReentrantLock(); 
public int women_present; 


public BathRoom(){ 
    women_present=0;//empty at start 
} 



public void woman_wants_to_enter (int i) { 
    lockW.lock(); 

    women_present++; 
    System.out.println ("Woman " + i + " enters bathroom ");  } 
public void woman_leaves (int i) { 
    try { 
     Thread.sleep (1000); 

    }catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println ("Woman " + i + " exits bathroom "); 
    if((women_present%3)==0){ 
     women_present=0; 
     lockW.unlock(); 
    } } 

这是女性类:

private int i; /* This identifies the woman. */ 
    private BathRoom bathroom; 

public Woman (BathRoom bathroom,int i) { 
     this.i = i; 
     this.bathroom = bathroom; 
    } 

public void run() { 
for (int i = 0; i < 3; i++) { 
    try { 
      Thread.sleep ((long) (500 * Math.random())); 
     }catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     bathroom.woman_wants_to_enter (i); 
     bathroom.woman_leaves (i); 
     } 
    }} 
+0

'if((women_present%3)== 0){'test。如果数字*已经为零,那么你只能解锁,让无意义的'%3'放在一边......最后,你根本不需要'women_present'计数器。你为每个'woman_wants_to_enter'调用'lock()',因此,你必须为每个'woman_leaves'调用'unlock'。然后,你已经完成了。 – Holger

+0

正如我所说,每个线程包含3名女性。 – demianr

+0

我给出的问题是在每个线程完成后解锁,而不是每个女人在thread.you可以想到它像每个线程是一组3个女人。 – demianr

我冒昧地修改代码:

package *; 

import java.util.concurrent.locks.Condition; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 

class BathRoom { 
    private Lock lockW=new ReentrantLock(); 
    private Condition c1=lockW.newCondition(); 
    public int women_present; 


    public BathRoom(){ 
     women_present=0;//empty at start 
    } 



    public void woman_wants_to_enter (int i) { 
     lockW.lock(); 
     while(women_present!=i) 
      try { 
       c1.await(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


     System.out.println ("Woman " + i + " enters bathroom ");  } 
    public void woman_leaves (int i) { 
     try { 
      Thread.sleep (1000); 

     }catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println ("Woman " + i + " exits bathroom "); 
     women_present++;  
     if(women_present==3){ 
      women_present=0; 
     } 
     c1.signal(); 
     lockW.unlock(); 
} 
} 
class Woman implements Runnable{ 
    private int i; /* This identifies the woman. */ 
     private BathRoom bathroom; 

    public Woman (BathRoom bathroom,int i) { 
      this.i = i; 
      this.bathroom = bathroom; 
     } 

    public void run() { 
    for (int i = 0; i < 3; i++) { 
     try { 
       Thread.sleep ((long) (500 * Math.random())); 
      }catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      bathroom.woman_wants_to_enter (i); 
      bathroom.woman_leaves (i); 
      } 
     } 
    } 

public class testdummy { 

    public static void main(String[] args) { 

     BathRoom b=new BathRoom(); 

     Woman w0=new Woman(b, 0); 
     Woman w1=new Woman(b, 1); 
     Woman w2=new Woman(b, 2); 

     Thread A=new Thread(w0); 
     Thread B=new Thread(w1); 
     Thread C=new Thread(w2); 

     A.start(); 
     B.start(); 
     C.start(); 



    } 

} 

我刚才所用条件对象的线程同步ACCE ss的方法,它不完美,但它的作品,希望它会给你一个更好的方法的想法。

+0

lock.unlock()应该是理想的最终块内 – Roshan

+0

宾果,非常感谢你 – demianr

+0

@demianr你可以upvote,如果你觉得这个答案适合你 – Roshan

第一线 在woman_wants_to_enter(), 线程aquires锁(),所以继续。 woman_present被设置为1

在woman_leaves(),woman_present仍为1 如果(1个模3是1),以便解锁不叫

第二线程进入woman_wants_to_enter(),但正在等待锁定

+0

在每个线程中有3个女人(在运行方法中的循环),只有在那之后我想释放锁定让其他线程(与3个女人在一起) – demianr

+0

我不想释放每个女人,但每3(数字每个线程中的女性) – demianr