黑马程序员技术交流社区
标题:
此代码的bug所在
[打印本页]
作者:
小十
时间:
2015-3-15 11:45
标题:
此代码的bug所在
import java.util.Random;
public class RunDeMo extends Thread {
public static void main(String[] args) throws Exception {
// share用于保存2个线程添加的数据
String[] share = new String[6];
Thread t1 = new Thread(new AddData(share), "线程A");
Thread t2 = new Thread(new AddData(share), "线程B");
t1.start();
t2.start();
// 当2个线程执行完,才执行下面的main线程程序
t2.join();
t1.join();
// 遍历share保存的数据
for (int i = 0; i < share.length; i++) {
System.out.println(Thread.currentThread().getName() + "--"
+ share[i]);
}
}
}
class AddData implements Runnable {
private String[] share;
public AddData(String[] share) {
this.share = share;
}
@Override
public void run() {
String[] data = { "第一个数据", "第二个数据", "第三个数据" };
int index = 0;
synchronized (share) {
for (int i = 0; i < data.length; i++) {
try {
Thread.sleep((new Random().nextInt(10) + 1) * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
share[index++] = Thread.currentThread().getName() + ":"
+ data[i];
}
}
}
}
复制代码
定义两个线程同时运行三次代码。
为什么只能读出来B的值A去哪了?
该线程怎么修改?
作者:
Shey
时间:
2015-3-15 12:21
本帖最后由 Shey 于 2015-3-15 12:28 编辑
1.synchronized是多个线程共同访问一个“对象”的某个数据是所起到的保护限制,你创建了两个AddData对象,那么对于两个线程所执行的对象是不同的,线程拥有资源也就不同(也就是属性不共用)
2.每个线程中对象的index在方法run内部,属于局部变量,每个线程start都会执行run方法,也就是都会临时创建一个index=0,这样对于数组share的0,1,2位置重复赋值2次,修改代码如下:
package temp;
import java.util.Random;
public class Demo2 extends Thread {
public static void main(String[] args) throws Exception {
// share用于保存2个线程添加的数据
String[] share = new String[6];
AddData addData = new AddData(share);
Thread t1 = new Thread(addData, "线程A");
Thread t2 = new Thread(addData, "线程B");
t1.start();
t2.start();
// 当2个线程执行完,才执行下面的main线程程序
t1.join();
t2.join();
// 遍历share保存的数据
for (int i = 0; i < share.length; i++) {
System.out.println(Thread.currentThread().getName() + "--"
+ share[i]);
}
}
}
class AddData implements Runnable {
private String[] share;
public AddData(String[] share) {
this.share = share;
}
int index = 0;
@Override
public void run() {
String[] data = { "第一个数据", "第二个数据", "第三个数据" };
synchronized (share) {
for (int i = 0; i < data.length; i++) {
try {
Thread.sleep((new Random().nextInt(10) + 1) * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
share[index++] = Thread.currentThread().getName() + ":"
+ data[i];
}
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2