您的位置:首页 > 编程语言 > Java开发

学习《java多线程编程核心技术》遇到的一些问题

2018-04-10 00:00 429 查看
摘要: 这两天在看《java多线程编程核心技术》,按照示例代码执行的结果总是和书上的对不上,经过多番分析得出:示例代码是得不到书上的结果的。

首先先贴出示例代码:

ThreadA:

public class ThreadA extends Thread {

private MyList list;
public ThreadA(MyList list) {
super();
this.list = list;
}

@Override
public void run() {
try {
for (int i=0;i<10;i++) {
list.add();
System.out.println("添加了"+(i+1)+"个元素");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

ThreadB:

public class ThreadB extends Thread {

private MyList list;

public ThreadB(MyList list) {
super();
this.list = list;
}

@Override
public void run() {
try {
while (true) {
if(list.size()==5) {
System.out.println("==5 了  线程 b 要退出了");
throw new InterruptedException();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

Test:

public class Test {

public static void main(String[] args) {
MyList service = new MyList();

ThreadA a = new ThreadA(service);
a.setName("A");
a.start();

ThreadB b = new ThreadB(service);
b.setName("B");
b.start();

}

}

以上代码主要是用来演示sleep() 加 while(true) 实现线程间通讯的示例代码,书中给出的示例结果是这样的:

添加了1个元素
添加了2个元素
添加了3个元素
添加了4个元素
添加了5个元素
==5 了  theadB 要退出了
java.lang.InterruptedException
at com.asiainfo.mcss.sm.thread.ThreadB.run(ThreadB.java:20)
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素

然而我的执行结果总是这样的:

添加了1个元素
添加了2个元素
添加了3个元素
添加了4个元素
添加了5个元素
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素

并且程序没有退出。这说明while(true)是执行的,但是符合进入list.size()==5的条件。

其实一开始我就认为示例代码是得不出示例的结果的,因为此书第二章节最后讲的是volatile关键字,说的是如何在变量线程间可见。theadA,threadB 中的list应该是线程私有栈中的变量,当时我就觉得声明MyList的时候要加volatile关键字才能得到示例结果,而且加了确实可以得到示例中的结果。但是我是个不太自信人,总觉的自己是不是哪里写错了,于是在while和if之间加了个sysout 打印看看list.size(),结果它居然进了if条件~~~我日~什么鬼,然后我有注释掉这行打印,它又没有进if条件。。。。



经过百般思过我想到了一个关键字synchronized 于是我点开System.out.Println()源码

/**
* Prints a String and then terminate the line.  This method behaves as
* though it invokes <code>{@link #print(String)}</code> and then
* <code>{@link #println()}</code>.
*
* @param x  The <code>String</code> to be printed.
*/
public void println(String x) {
synchronized (this) {
print(x)
7fe8
;
newLine();
}
}

同步关键字可以间接保证线程间变量可见性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java synchronized