2.2.6对象锁synchronized(this)锁定的是当前对象

来源:互联网 发布:java resultset 行数 编辑:程序博客网 时间:2024/05/18 01:09

package cha02.execise16;/** * Created by sunyifeng on 17/9/25. */public class Task {    // 短任务    public void doShortTimeTask() {        System.out.println("---运行短任务---");    }    // 长任务    public void doLongTimeTask() {        synchronized (this) {            for (int i = 0; i < 200; i++) {                System.out.println("长任务的线程名称:" + Thread.currentThread().getName() + ",i=" + (i + 1));            }        }    }}
package cha02.execise16;/** * Created by sunyifeng on 17/9/25. */public class MyThread1 extends Thread {    private Task task;    public MyThread1(Task task){        super();        this.task = task;    }    @Override    public void run(){        super.run();        task.doLongTimeTask();    }}
package cha02.execise16;/** * Created by sunyifeng on 17/9/25. */public class MyThread2 extends Thread {    private Task task;    public MyThread2(Task task){        super();        this.task = task;    }    @Override    public void run(){        super.run();        task.doShortTimeTask();    }}
package cha02.execise16;/** * Created by sunyifeng on 17/9/25. */public class Run {    public static void main(String[] args) throws InterruptedException {        Task task = new Task();        // 线程1,执行长任务        MyThread1 myThread1 = new MyThread1(task);        myThread1.start();        Thread.sleep(1);        // 线程2,执行短任务        MyThread2 myThread2 = new MyThread2(task);        myThread2.start();    }}
运行结果:

长任务的线程名称:Thread-0,i=60
长任务的线程名称:Thread-0,i=61
长任务的线程名称:Thread-0,i=62
---运行短任务---
长任务的线程名称:Thread-0,i=63
长任务的线程名称:Thread-0,i=64
长任务的线程名称:Thread-0,i=65
长任务的线程名称:Thread-0,i=66

程序分析:

两个线程的执行时异步的。短任务改成同步的方法。

// 短任务synchronized public void doShortTimeTask() {    System.out.println("---运行短任务---");}
运行结果:

长任务的线程名称:Thread-0,i=200
---运行短任务---

程序分析:

两个方法的同步锁,锁定的是同一个对象。

阅读全文
0 0
原创粉丝点击