线程操作案例——生产者和消费者
老师提出如何同步多线程,他采用了以下代码。(就是创造个set synchronized method还有一个 get synchronized method)
class Info{ // 定义信息类
private String name = "李四"; // 定义name属性
private String content = "父亲" ; // 定义content属性
public synchronized void set(String name,String content){
this.setName(name) ; // 设置名称
try{
Thread.sleep(300) ;
}catch(InterruptedException e){
e.printStackTrace() ;
}
this.setContent(content) ; // 设置内容
}
public synchronized void get(){
try{
Thread.sleep(300) ;
}catch(InterruptedException e){
e.printStackTrace() ;
}
System.out.println(this.getName() +
" --> " + this.getContent()) ;
}
public void setName(String name){
this.name = name ;
}
public void setContent(String content){
this.content = content ;
}
public String getName(){
return this.name ;
}
public String getContent(){
return this.content ;
}
};
class Producer implements Runnable{ // 通过Runnable实现多线程
private Info info = null ; // 保存Info引用
public Producer(Info info){
this.info = info ;
}
public void run(){
boolean flag = false ; // 定义标记位
for(int i=0;i<50;i++){
if(flag){
this.info.set("李四","父亲") ; // 设置名称
flag = false ;
}else{
this.info.set("liming","son") ; // 设置名称
flag = true ;
}
}
}
};
class Consumer implements Runnable{
private Info info = null ;
public Consumer(Info info){
this.info = info ;
}
public void run(){
for(int i=0;i<50;i++){
this.info.get() ;
}
}
};
public class ThreadCaseDemo02{
public static void main(String args[]){
Info info = new Info(); // 实例化Info对象
Producer pro = new Producer(info) ; // 生产者
Consumer con = new Consumer(info) ; // 消费者
new Thread(pro).start() ;
new Thread(con).start() ;
}
};
我现在想知道的是如果我不创造一个set 和 get synchronized method,而是用
synchronized(this) 来表示,这样子代码应该也可以同步吧?以下是改的,但是运行的时候
结果却没有同步。这是为什么啊?
class Info { // 定义信息类
private String name = "李四"; // 定义name属性
private String content = "父亲"; // 定义content属性
public void setName(String name) {
this.name = name;
}
public void setContent(String content) {
this.content = content;
}
public String getName() {
return this.name;
}
public String getContent() {
return this.content;
}
};
class Producer implements Runnable { // 通过Runnable实现多线程
private Info info = null; // 保存Info引用
public Producer(Info info) {
this.info = info;
}
public void run() {
boolean flag = false; // 定义标记位
for (int i = 0; i < 50; i++) {
if (flag) {
synchronized (this) {
this.info.setName("李四") ;
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.info.setContent("父亲");
} // 设置内容
flag = false;
} else {
synchronized (this) {
this.info.setName("liming"); // 设置名称
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.info.setContent("son");
} // 设置内容
flag = true;
}
}
}
};
class Consumer implements Runnable {
private Info info = null;
public Consumer(Info info) {
this.info = info;
}
public void run() {
for (int i = 0; i < 50; i++) {
synchronized (this) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.info.getName() + " --> "
+ this.info.getContent());
}
}
}
};
public class ThreadCaseDemo02 {
public static void main(String args[]) {
Info info = new Info(); // 实例化Info对象
Producer pro = new Producer(info); // 生产者
Consumer con = new Consumer(info); // 消费者
new Thread(pro).start();
new Thread(con).start();
}
};
|
|