本帖最后由 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];
- }
- }
- }
- }
复制代码
|