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

来源:互联网 发布:数据安全保密制度 编辑:程序博客网 时间:2024/06/16 05:43

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的执行是异步的,这就可能出现脏读的情况。

原创粉丝点击