Bonjour j ai un problème de processus ou plutot d exclusion mutuelle.
Voila ce que j aimerai faire :

J ai une classe A qui a 2 paramètre B et C. Les classe B et C ecrivent lisent dans des fichiers differents (pour l'instant ca va).
Quand je lance plusieurs A, par exemple a1 et a2, a1.b et a2.b ne doivent pas ecrite ET lire en meme temps. Par contre a1.b et a2.c ou a1.c et a2.b peuvent ecrirent ET lire en meme temps car ils le font dans des fichiers separés.

J ai simplifier le tout en faisant des print. Voici le code :

La classe A est la classe principale.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
 
public class A implements Runnable
{
    public B b;
    public C c;
    int i;
 
    public A(B b, C c)
    {
        this.b = b;
        this.c = c;
    }
 
    public void run()
    {
        while (true)
        {
            b.write();
            b.read();
            c.write();
            c.read();
        }
    }
 
    public static void main(String[] args)
    {
        	MB mb = new MB();
        	MC mc = new MC();
 
            A a1 = new A(new B("b j ecris", "aaaa", 1, mb), 
                         new C("c j ecris",  "eeeee",1, mc));
            Thread t1 = new Thread(a1);
            A a2 = new A(new B("b j ecris", "zzzzzz", 2, mb), 
                         new C("c j ecris", "qqqqq", 2, mc));
            Thread t2 = new Thread(a2);
            t1.start();
            t2.start();
    }
}
 
public class B
{
    String s;
    String ss;
    int i;
    MB mb;
    A a;
 
    public B(String s, String ss, int i, MB mb) 
    {
        this.s = s;
        this.ss = ss;
        this.i = i;
        this.mb = mb;
 
    }
 
    public void write()
    {
        mb.isBusy();
        System.out.println("B " + i + " ecrit , free = " + mb.free);
 
    }
 
    public void read()
    {
        System.out.println("B " + i + " lit ");
        mb.isReady();
    }
}
 
public class C
{
    String s;
    String ss;
    int i;
    MC mc;
 
    public C(String s, String ss, int i, MC mc) 
    {
        this.s = s;
        this.ss = ss;
        this.i = i;
        this.mc = mc;
    }
 
    public void write()
    {
        mc.isBusy();
        System.out.println("C " + i + " ecrit , free = " + mc.free);
    }
 
    public void read()
    {
        System.out.println("C " + i + " lit ");
        mc.isReady();
    }
}
 
public class MC
{
 
    boolean free;
 
   public MC()
   {
       free = true;
   }
 
   public synchronized void isReady()
   {
       //System.out.println("C DEBUT SECTION CRITIQUE");
       free = true;
       notifyAll();
 
   }
 
   public synchronized void isBusy()
   {
       while (free = false)
       {
           try
           {
               wait();
               System.out.println("CCCCCCCCCCCCCCCC " + " attend");
           }
           catch (InterruptedException e)
           {
               e.printStackTrace();
           }
       }
       free = false;
   }
}
 
public class MB
{
   boolean free;
 
   public MB()
   {
       free = true;
   }
 
   public synchronized void isReady()
   {
       //System.out.println("B DEBUT SECTION CRITIQUE");
       free = true;
       notifyAll();
 
   }
 
   public synchronized void isBusy()
   {
       while (free = false)
       {
           try
           {
               wait();
               System.out.println("BBBBBBBBBBBBBBBBBB " + " attend");
           }
           catch (InterruptedException e)
           {
               e.printStackTrace();
           }
       }
       free = false;
   }
}
La classe MB et MC devrait normalement (enfin je pense) permettre l exclusion mutuelle de l'ecriture et lecture.

Je ne comprend pas mais a1.b et a2.b par exemple peuvent lire et ecrire en meme temps. Par exemple un résultat faux est :
a1.b ecrit
a2.b ecrit
a2.b lit
a1.b lit
Ceci est faux car a2.b ne pourra ecrire seulement apres que a1.b ait lu.

Ou est le probleme ?
Je ne peux pas changer trop changer la structure de mon programme car il est bcp plus compliqué.

Merci pour votre aide