用一个数据来表示数据存储空间
package com.yan.test;
public class SyncStack {
private int index = 0;
private char[] stack = new char[6];
public synchronized void push(char temp) {
if (index == stack.length) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
stack[index] = temp;
index++;
System.out.println(Thread.currentThread().getName() + " push " + temp);
}
public synchronized char pop() {
if (index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
System.out.println("___" + Thread.currentThread().getName() + " ---pop " + stack[index]);
return stack[index];
}
}
生产者
package com.yan.test;
public class Produce implements Runnable {
private SyncStack stack;
int i = 0;
public Produce(SyncStack stack) {
super();
this.stack = stack;
}
public void run() {
while (true) {
synchronized (this) {
if (i < 28) {
stack.push((char) ((char) i + 'A'));
i++;
} else {
break;
}
}
}
}
}
消费者
package com.yan.test;
public class Consumer implements Runnable {
private SyncStack stack;
int i = 0;
public Consumer(SyncStack stack) {
super();
this.stack = stack;
}
public void run() {
while (true) {
synchronized (this) {
if (i < 28) {
stack.pop();
i++;
} else {
break;
}
}
}
}
}
测试的main方法
package com.yan.test;
public class TestSysn {
public static void main(String[] args) {
SyncStack s = new SyncStack();
Produce p = new Produce(s);
Consumer c = new Consumer(s);
Thread t1 = new Thread(p);
t1.setName("product1");
Thread t3 = new Thread(p);
t3.setName("product2");
Thread t5 = new Thread(p);
t5.setName("product3");
t3.start();
t1.start();
t5.start();
Thread t2 = new Thread(c);
t2.setName("Consumer1");
Thread t4 = new Thread(c);
t4.setName("Consumer2");
t2.start();
t4.start();
}
}
结果
product2 push A
product1 push B
product2 push C
product1 push D
product2 push E
product1 push F
___Consumer1 ---pop F
product2 push G
___Consumer1 ---pop G
___Consumer1 ---pop E
___Consumer1 ---pop D
___Consumer1 ---pop C
___Consumer1 ---pop B
___Consumer1 ---pop A
product1 push H
___Consumer1 ---pop H
product3 push I
___Consumer1 ---pop I
product2 push J
___Consumer1 ---pop J
product1 push K
___Consumer1 ---pop K
product3 push L
___Consumer1 ---pop L
product2 push M
___Consumer1 ---pop M
product1 push N
___Consumer2 ---pop N
product3 push O
___Consumer1 ---pop O
product2 push P
___Consumer2 ---pop P
product1 push Q
___Consumer1 ---pop Q
product3 push R
___Consumer2 ---pop R
product2 push S
___Consumer1 ---pop S
product1 push T
___Consumer2 ---pop T
product3 push U
___Consumer1 ---pop U
product2 push V
___Consumer2 ---pop V
product1 push W
___Consumer1 ---pop W
product3 push X
___Consumer2 ---pop X
product2 push Y
___Consumer1 ---pop Y
product1 push Z
product3 push [
___Consumer2 ---pop [
product2 push \
___Consumer1 ---pop \
___Consumer2 ---pop Z
本文通过实现同步栈和生产者消费者模型,深入探讨并发编程中的同步与互斥机制,展示了如何使用wait()和notify()方法进行线程间的协作与资源的共享。

被折叠的 条评论
为什么被折叠?



