同步和异步
同步和异步通常用来形容一次方法的调用。同步方法调用一旦开始,调用者必须完成所有的操作一直到方法调用结束,其他调用者才能继续后续的行为,
异步方法调用类似一个消息传递,一旦开始,方法调用就会立即返回,其他调用者则可以无需等待,可以立即继续后续的操作。
异步:
不过, 如果 我们 赶时髦, 就坐 在家 里 打开 电脑, 在 网上 订购 了 一台 空调。 当你 完成 网上 支付 的 时候, 对 你来 说 购物 过程 已经 结束 了。 虽然 空调 还没 送 到家, 但是 你的 任务 都已 经 完成 了。 商家 接到 了 你的 订单 后, 就会 加紧 安排 送货, 当然 这一 切 已经 跟你 无关 了。 你 已经 支付 完成, 想 干什么 就 能去 干什么, 出去 溜 几 圈 都不 成问题, 等 送货上门 的 时候, 接到 商家 的 电话, 回家 一 趟 签收 就 完事 了。 这就 是 异步 调用。
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() 方法。