2.2.7多个线程调用同一个方法是随机的

package cha02.execise18;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by sunyifeng on 17/9/25.
 */
public class MyList {
    private List list = new ArrayList<Object>();

    synchronized public void add(String username) {
        System.out.println("线程" + Thread.currentThread().getName() + "执行了add方法");
        list.add(username);
        System.out.println("线程" + Thread.currentThread().getName() + "退出了add方法");
    }

    synchronized public int getSize() {
        System.out.println("线程" + Thread.currentThread().getName() + "执行了get方法");
        int sizeValue = list.size();
        System.out.println("线程" + Thread.currentThread().getName() + "退出了get方法");
        return sizeValue;
    }
}

package cha02.execise18;

/**
 * Created by sunyifeng on 17/9/25.
 */
public class ThreadA extends Thread {
    private MyList myList;

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

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            myList.add("threadA" + (i + 1));
        }
    }
}
package cha02.execise18;

/**
 * Created by sunyifeng on 17/9/25.
 */
public class ThreadB extends Thread {
    private MyList myList;

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

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            myList.add("threadB" + (i + 1));
        }
    }
}
package cha02.execise18;

/**
 * Created by sunyifeng on 17/9/25.
 */
public class Test {
    public static void main(String[] args) {
        MyList myList = new MyList();
        //
        ThreadA threadA = new ThreadA(myList);
        threadA.setName("A");
        threadA.start();
        //
        ThreadB threadB = new ThreadB(myList);
        threadB.setName("B");
        threadB.start();
    }
}
运行结果:

线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程A执行了add方法
线程A退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程B执行了add方法
线程B退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程A执行了add方法
线程A退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
线程B执行了add方法
线程B退出了add方法
程序说明:

同步块中的代码是同步打印的,当前线程的执行与退出都是成对出现,但是线程A、线程B的执行是异步的,这就可能出现脏读的情况。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值