package domain;
/**
* 测试用类
* @author dell
*
*/
public class Person {
private String name;
private String sex;
private boolean flag;
public Person(boolean flag){
this.flag = flag;
}
public boolean getFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
package baidumap;
import domain.Person;
public class ThreadDemo02 {
public static void main(String[] args) {
Person p = new Person(false);
ProducerTask producerTask = new ProducerTask(p);
ConsumerTask consumerTask = new ConsumerTask(p);
Thread t1 = new Thread(producerTask);
Thread t2 = new Thread(consumerTask);
t1.start();
t2.start();
}
}
// 生产者
class ProducerTask implements Runnable {
private Person p;
public ProducerTask(Person p) {
this.p = p;
}
boolean flag = true;
public void run() {
// 生产者不断赋值
while (true) {
synchronized (p) {
if (!p.getFlag()) { // 如果还没有值就往里赋值
p.setFlag(true);
if (flag) { // 这个判断主要是为了两次赋不同的值,看到效果
p.setName("张三");
p.setSex("男");
flag = false;
continue;
}
if (!flag) {
p.setName("小红");
p.setSex("女");
flag = true;
continue;
}
}
}
}
}
}
// 消费者
class ConsumerTask implements Runnable {
private Person p;
public ConsumerTask(Person p) {
this.p = p;
}
public void run() {
// 消费者不断取值
while (true) {
synchronized (p) {
if (p.getFlag()) { // 如果有值了就取值出来
p.setFlag(false);
System.out.println(p.getName() + "............." + p.getSex());
}
}
}
}
}
运行效果如下:没有出现线程安全问题