2.2.16锁对象的改变

来源:互联网 发布:美国硕士一年花费知乎 编辑:程序博客网 时间:2024/06/07 04:49

package demo;/** * Created by sunyifeng on 17/10/12. */public class MyService {    private String lock = "123";    public void testMethod() {        try {            synchronized (lock) {                System.out.println("线程开始,线程名称:" + Thread.currentThread().getName() + ",当前时间:" + System.currentTimeMillis() + ",lock:" + lock);                lock = "456";                Thread.sleep(2000);                System.out.println("线程结束,线程名称:" + Thread.currentThread().getName() + ",当前时间:" + System.currentTimeMillis() + ",lock:" + lock);            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
package demo;/** * Created by sunyifeng on 17/10/12. */public class ThreadA extends Thread {    private MyService service;    public ThreadA(MyService myService) {        super();        this.service = myService;    }    @Override    public void run(){        super.run();        service.testMethod();    }}
package demo;/** * Created by sunyifeng on 17/10/12. */public class ThreadB extends Thread {    private MyService service;    public ThreadB(MyService myService) {        super();        this.service = myService;    }    @Override    public void run(){        super.run();        service.testMethod();    }}
package demo;/** * Created by sunyifeng on 17/10/12. */public class Run1 {    public static void main(String[] args) throws InterruptedException{        MyService myService = new MyService();        //        ThreadA threadA = new ThreadA(myService);        threadA.setName("A");        //        ThreadB threadB = new ThreadB(myService);        threadB.setName("B");        //        threadA.start();        Thread.sleep(50);        threadB.start();    }}
运行结果:

线程开始,线程名称:A,当前时间:1507826311158,lock:123
线程开始,线程名称:B,当前时间:1507826311212,lock:456
线程结束,线程名称:A,当前时间:1507826313162,lock:456
线程结束,线程名称:B,当前时间:1507826313216,lock:456

程序分析:

线程A持有的对象锁是“123”,进入同步代码块之后,线程A把锁改成“456”,线程B获取的锁是“456”,所以程序是异步执行。

更改代码:

package demo;/** * Created by sunyifeng on 17/10/12. */public class Run1 {    public static void main(String[] args) throws InterruptedException{        MyService myService = new MyService();        //        ThreadA threadA = new ThreadA(myService);        threadA.setName("A");        //        ThreadB threadB = new ThreadB(myService);        threadB.setName("B");        //        threadA.start();        // Thread.sleep(50); // FIXME:注释此行        threadB.start();    }}
运行结果(有时候同步,有时候异步?):

线程开始,线程名称:A,当前时间:1507826551481,lock:123
线程结束,线程名称:A,当前时间:1507826553483,lock:456
线程开始,线程名称:B,当前时间:1507826553483,lock:456
线程结束,线程名称:B,当前时间:1507826555487,lock:456

程序分析:

线程A,线程A同时竞争CUP资源,有时候同步执行,有时候异步执行?


原创粉丝点击