多线程-线程同步、异步

同步和异步

  同步和异步通常用来形容一次方法的调用。同步方法调用一旦开始,调用者必须完成所有的操作一直到方法调用结束,其他调用者才能继续后续的行为,

异步方法调用类似一个消息传递,一旦开始,方法调用就会立即返回,其他调用者则可以无需等待,可以立即继续后续的操作。

异步:

不过, 如果 我们 赶时髦, 就坐 在家 里 打开 电脑, 在 网上 订购 了 一台 空调。 当你 完成 网上 支付 的 时候, 对 你来 说 购物 过程 已经 结束 了。 虽然 空调 还没 送 到家, 但是 你的 任务 都已 经 完成 了。 商家 接到 了 你的 订单 后, 就会 加紧 安排 送货, 当然 这一 切 已经 跟你 无关 了。 你 已经 支付 完成, 想 干什么 就 能去 干什么, 出去 溜 几 圈 都不 成问题, 等 送货上门 的 时候, 接到 商家 的 电话, 回家 一 趟 签收 就 完事 了。 这就 是 异步 调用。

public class MyThread3 {
    private synchronized void method1() {
        try {
            System.err.println("线程:" + Thread.currentThread().getName());
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    private  void metho2() {
        System.err.println("线程:" + Thread.currentThread().getName());
    }

    public static void main(String[] agrs) {
        MyThread3 t = new MyThread3();
        Thread a = new Thread(new Runnable() {
            @Override
            public void run() {
                t.method1();
            }
        }, "t1");
        Thread b = new Thread(new Runnable() {
            @Override
            public void run() {
                t.metho2();
            }
        }, "t2");
        a.start();
        b.start();
    }

}

运行结果:

 

同步:

打个 比方, 比如 我们 去 购物, 如果 你去 商场 实体 店 买 一台 空调, 当你 到了 商场 看 中了 一 款 空调, 你就 想 售货员 下单。 售货员 去 仓库 帮你 调配 物品。 这 天 你 热得 实在 不行了, 就 催 着 商家 赶紧 给你 送货, 于是 你就 等在 商 店里, 候 着 他们, 直到 商家 把你 和 空调 一起 送 回家, 一次 愉快 的 购物 就 结束 了。 这就是 同步 调用。

/**
     * 同步:synchronized
     *      同步的概念就是共享,如果不是共享资源则没必要进行同步;同步的目的是为了线程安全,线程安全只需要满足该特性:原子性(同步)、可见性
     */

    private synchronized void metho2() {
        System.err.println("线程:" + Thread.currentThread().getName());
    }

运行结果:等待了2秒钟

 

 

 

  1.a线程先获取了t对象的锁,b线程可以异步访问t对象的方法 metho2() 无 synchronized 修饰的方法。

  2.a线程获取了t对象的锁,b线程争取去那t对象的锁,这个时候对象使用同步 synchronized 修饰了metho2() 方法,a线程休眠了2秒,metho2() 方法的锁还么有释放,2秒后,锁被释放了,a对象的操作全部结束;b线程这个时候才真正的拿到了t对象的锁,去调用metho2() 方法。

posted @ 2017-06-08 22:47  逍遥叹!!  阅读(352)  评论(0编辑  收藏  举报