多线程-线程同步、异步

同步和异步

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

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

异步:

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

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() 方法。

时间: 2024-10-21 22:51:49

多线程-线程同步、异步的相关文章

进程 线程 多线程 并发 同步异步

进程 线程 多线程 并发 同步异步 很多人对进程,线程,多线程,并发,同步,异步等概念感到困惑,这都是大学没好好听课的缘故啊.咱在这里帮感到概念给感到困惑的同学复习下. 程序 程序用来描述计算机所完成的独立功能,并在时间上严格地按前后次序相继地进行计算机操作序列集合,是一个静态概念. 进程 并发执行的程序在执行过程中分配和管理资源的基本单位.是一个动态的执行过程. 进程的静态描述 进程控制块PCB 有关程序段 该程序员对齐进行操作的数据结构集 进程控制块PCB 进程控制块PCB是系统管制进程存在

多线程&线程同步

线程 程序执行过程中,并发执行的代码段. 线程之间可以共享内存. 线程安全 增加了同步处理,确保在同一时刻,只有一个线程执行同步代码. 保证线程安全的方法就是锁机制 java中的任何对象都可以作为锁对象 synchronized(lock){....} 代码块中的代码被确保同一时间只有一个线程才能执行 同步方法是用当前对象作为同步对象(this) public synchronized int getTicket(){...} synchronized关键字也能加在方法上 确保同一时间只有一个线

黑马程序员--Java基础--多线程|线程同步

--Java培训.Android培训.iOS培训..Net培训 期待与您共同交流!-- 多线程基础.线程同步 1. 多线程基础 1.1. 进程和线程 1.1.1. 什么是进程 所谓进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元.进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问.线程只能归属于一个进程并且它只能访问该进程所拥有的资源.当操作系统创建一个进程后,该进程会自动

进程&线程 同步异步&阻塞非阻塞

2015-08-19 15:23:38 周三 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码 线程安全问题都是由全局变量及静态变量引起的 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用 线程不安全就是不提供数

多线程——线程同步,死锁

线程同步: 为什么需要同步 ①   线程同步是为了防止多个线程访问一个数据对象时,对数据造成破坏. ②   线程的同步是保证多线程安全访问竞争资源的一种手段. 同步和锁 ①   Java中每一个对象都有一个内置锁. ②   当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁:当程序运行到synchronized同步代码块时,自动获得锁定对象的锁. ③   获得一个对象的锁也称为获取锁.锁定对象.在对象上锁定或在对象上同步.当程序运

Java多线程 线程同步

如果你正在写一个变量,它可能接下来将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你需要使用同步,并且,读写线程都必须用相同的监视器锁同步.--Brain同步规则 synchronized 所有对象都自动含有单一的锁,当在调用一个对象的任意synchronized方法时,此对象将被加锁. 对于某个特定对象来说,所有的synchronized方法共享同一个锁.所以某个线程在访问对象的一个synchronized方法时,其他线程访问该对象的任何synchronized方法都

Java多线程——线程同步

在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的控制吧. 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问.   一.多线程引起的数据访问安全问题 下面看一个经典的问题,银行取钱的问题: 1).你有一张银行卡,里面有50

JAVA多线程线程同步问题

线程同步 在多线程的编程环境下,可能看着没有问题的代码在运行几千上万或者更多次后,出现了一些看着很奇怪的问题,出现这样的问题的原因就是可能会有两个或者更多个线程进入了同一块业务处理代码中导致了判断失效.为了解决这个问题,JAVA引入了同步监视器来解决这个问题.同步监视器的通用方法就是同步代码块,也就是给一块代码加了同步锁. package cn.test.hf; import java.math.BigDecimal; /** * 模拟取钱操作 */public class RunnableTe

9 C++ Boost 多线程,线程同步

线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程 线程中断 线程中断2, 线程组 boost 线程的死锁 boost 线程递归锁 线程互斥锁,线程同步 unique_lock 锁,离开作用域自动释放 unique_lock 锁 示例 2,可以显式的释放锁 boost 1次初始化 boost 条件变量 boost 线程锁,一个账户往另外一个账户转钱案例 boost upgrade_lock 知识背景