精华内容
下载资源
问答
  • 线程的同步和异步

    2016-10-30 16:11:00
    线程的同步和异步 多线程和异步操作的异同  多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作...

    线程的同步和异步

    多线程和异步操作的异同

      多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。

      异步操作的本质

      所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。所以即使在DOS这样的单进程(而且无线程概念)系统中也同样可以发起异步的DMA操作。

      线程的本质
      线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。

      异步操作的优缺点

      因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少共享变量的数量),减少了死锁的可能。当然异步操作也并非完美无暇。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些初入,而且难以调试。

      多线程的优缺点
      多线程的优点很明显,线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。但是多线程的缺点也同样明显,线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现。

      适用范围

      在了解了线程与异步操作各自的优缺点之后,我们可以来探讨一下线程和异步的合理用途。我认为:当需要执行I/O操作时,使用异步操作比使用线程+同步I/O操作更合适。I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.Net Remoting等跨进程的调用。
      而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还无伤大雅,如果需要处理大量的并发操作时就不合适了。

     

    线程同步与异步区别

    线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低    线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制

    异步处理就是,你现在问我问题,我可以不回答你,等我用时间了再处理你这个问题.同步不就反之了,同步信息被立即处理 -- 直到信息处理完成才返回消息句柄;异步信息收到后将在后台处理一段时间 -- 而早在信息处理结束前就返回消息句柄

    转载于:https://www.cnblogs.com/daisyforever/p/6013349.html

    展开全文
  • 线程同步和异步的区别

    千次阅读 2019-03-21 09:06:04
    而这些区别造成了使用多线程和异步操作的时机的区别。  异步操作的本质  所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的...

    多线程和异步操作的异同

      多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。

      异步操作的本质

      所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。所以即使在DOS这样的单进程(而且无线程概念)系统中也同样可以发起异步的DMA操作。

      线程的本质
      线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。

      异步操作的优缺点

      因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少共享变量的数量),减少了死锁的可能。当然异步操作也并非完美无暇。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些初入,而且难以调试。

      多线程的优缺点
      多线程的优点很明显,线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。但是多线程的缺点也同样明显,线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现。

      适用范围

      在了解了线程与异步操作各自的优缺点之后,我们可以来探讨一下线程和异步的合理用途。我认为:当需要执行I/O操作时,使用异步操作比使用线程+同步I/O操作更合适。I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.Net Remoting等跨进程的调用。
      而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还无伤大雅,如果需要处理大量的并发操作时就不合适了。

     

    线程同步与异步区别

    线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低    线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制

    异步处理就是,你现在问我问题,我可以不回答你,等我用时间了再处理你这个问题.同步不就反之了,同步信息被立即处理 -- 直到信息处理完成才返回消息句柄;异步信息收到后将在后台处理一段时间 -- 而早在信息处理结束前就返回消息句柄

    展开全文
  • Java线程的同步和异步的区别

    千次阅读 2014-05-20 18:08:12
    1.    多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程...系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制

    1.

                                                                    同步与异步

       多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线

    程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局资源造成的,有时为了解

    决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲

    系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制


    同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求

          不到,怎么办,A线程只能等待下去

    异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程

          仍然请求的到,A线程无需等待


    显然,同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个

    进程崩溃,但没有同步机制的存在,性能会有所提升


    java中实现多线程

    1)继承Thread,重写里面的run方法

    2)实现runnable接口

     

    举个例子:普通B/S模式(同步)AJAX技术(异步)

    同步:提交请求->等待服务器处理->处理完返回这个期间客户端浏览器不能干任何事

    异步:请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

    可见,彼“同步”非此“同步”——我们说的java中的那个共享数据同步(synchronized)

    一个同步的对象是指行为(动作),一个是同步的对象是指物质(共享数据)。


    一、关键字:

    thread(线程)、thread-safe(线程安全)、intercurrent(并发的)

    synchronized(同步的)、asynchronized(异步的)、

    volatile(易变的)、atomic(原子的)、share(共享)

    二、概念

    1.

    要跨线程维护正确的可见性,只要在几个线程之间分享非 final 变量,就必须使用 synchronized(或 volatile)

    以确保一个线程可以看见另一个线程做的更改。

    2、

    为了在线程之间进行可靠的通信,也为了互斥访问,同步是必须的。这归因于java语言规范的内存模型,它规定了:

    一个线程所做的变化何时以及如何变成对其它线程可见。

    3.

    多线程将异步行为引进程序,所以在需要同步时,必须有一种方法强制进行。例如:如果2个线程想要通信并且要

    共享一个复杂的数据结构,如链表,此时需要确保它们互不冲突,也就是必须阻止B线程在A线程读数据的过程中

    向链表里面写数据(A获得了锁,B必须等A释放了该锁)

    4.同步

    java在一个旧的的进程同步模型——监控器(Monitor)的基础上实现了一个巧妙的方案:监控器是一个控制机制,

    可以认为是一个很小的、只能容纳一个线程的盒子,一旦一个线程进入监控器,其它的线程必须等待,直到那个

    线程退出监控为止。通过这种方式,一个监控器可以保证共享资源在同一时刻只可被一个线程使用。这种方式称

    之为同步。(一旦一个线程进入一个实例的任何同步方法,别的线程将不能进入该同一实例的其它同步方法,

    但是该实例的非同步方法仍然能够被调用)。

    5.同步和多线程关系:没多线程环境就不需要同步;有多线程环境也不一定需要同步。


    6.锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)

     

    互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议

    ,这样,一次就只有一个线程能够使用该共享数据。


    可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个

    线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前

    的值或不一致的值,这将引发许多严重问题


    小结:为了防止多个线程并发对同一数据的修改,所以需要同步,否则会造成数据不一致(就是所

    谓的:线程安全。如java集合框架中Hashtable和Vector是线程安全的。我们的大部分程序都不是线

    程安全的,因为没有进行同步,而且我们没有必要,因为大部分情况根本没有多线程环境)


    7. 不要搞混了:同步、异步


    举个例子:普通B/S模式(同步)AJAX技术(异步)同步:提交请求->等待服务器处理->处理完返回 这个期间客户端浏览器不能干任何事

    异步:请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕可见,彼“同步”非此“同步”

    ——我们说的java中的那个共享数据同步(synchronized)

    一个同步的对象是指行为(动作),一个是同步的对象是指物质(共享数据)。

    8、

     Java同步机制有4种实现方式:(部分引用网上资源)

    ①    ThreadLocal ② synchronized( ) ③ wait() 与 notify() ④ volatile

    目的:都是为了解决多线程中的对同一变量的访问冲突


    ThreadLocal 保证不同线程拥有不同实例,相同线程一定拥有相同的实例,即为每一个使用该变量的

    线程提供一     个该变量值的副本,每一个线程都可以独立改变自己的副本,而不是与其它线程

    副本冲突。

    优势:提供了线程安全的共享对象

    与其它同步机制的区别:同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之

    间进行通信;而 ThreadLocal 是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源

    这样当然不需要多个线程进行同步了。

       volatile
        volatile 修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且

    当成员变量发生变化时,强迫线程将变化值回写到共享内存。

    优势:这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。缘由:Java 语言规范

    中指出,为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开

    同步代码块时才与共享成员变量的原始值对比。这样当多个线程同时与某个对象交互时,就必须要

    注意到要让线程及时的得到共享成员变量的变化。而 volatile 关键字就是提示 VM :对于这个成

    员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

    使用技巧:在两个或者更多的线程访问的成员变量上使用 volatile 。当要访问的变量已在

    synchronized 代码块中,或者为常量时,不必使用。


            线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的

    是B。只在某些动作时才进行A和B的同步,因此存在A和B不一致的情况。volatile就是用来避免这种

    情况的。 volatile告诉jvm,它所修饰的变量不保留拷贝,直接访问主内存中的(读操作多时使用

    较好;线程间需要通信,本条做不到)

    Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自

    动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的

    一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。


    您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理

    想的线程安全,必须同时满足下面两个条件:

    对变量的写操作不依赖于当前值;该变量没有包含在具有其他变量的不变式中。

     

      sleep() vs wait()
        sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监

    控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
        wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁

    定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁

    进入运行状态。

    (如果变量被声明为volatile,在每次访问时都会和主存一致;如果变量在同步方法或者同步块中

    被访问,当在方法或者块的入口处获得锁以及方法或者块退出时释放锁时变量被同步。)


    三、例子:

    Demo1:

    package test.thread;

    class SynTest{


    //非同步

    static void method(Thread thread){

    System.out.println("begin "+thread.getName());

    try{

    Thread.sleep(2000);

    }catch(Exception ex){

    ex.printStackTrace();

    }

    System.out.println("end "+thread.getName());

    }

     

    //同步方式一:同步方法

    synchronized static void method1(Thread thread){//这个方法是同步的方法,每次只有一

    个线程可以进来

    System.out.println("begin "+thread.getName());

    try{

    Thread.sleep(2000);

    }catch(Exception ex){

    ex.printStackTrace();

    }

    System.out.println("end "+thread.getName());

    }

     

    //同步方式二:同步代码块

    static void method2(Thread thread){

    synchronized(SynTest.class) {

    System.out.println("begin "+thread.getName());

    try{

    Thread.sleep(2000);

    }catch(Exception ex){

    ex.printStackTrace();

    }

    System.out.println("end "+thread.getName());

    }

    }

     

     

    //同步方式三:使用同步对象锁

    private static Object _lock1=new Object();

    private static byte _lock2[]={};//据说,此锁更可提高性能。源于:锁的对象越小越好

    static void method3(Thread thread){

    synchronized(_lock1) {

    System.out.println("begin "+thread.getName());

    try{

    Thread.sleep(2000);

    }catch(Exception ex){

    ex.printStackTrace();

    }

    System.out.println("end "+thread.getName());

    }

    }

     

    public static void main(String[] args){

    //启动3个线程,这里用了匿名类

    for(int i=0;i<3;i++){

    new Thread(){

    public void run(){

    method(this);

    //method1(this);

    //method2(this);

    //method3(this);

    }

    }.start();

    }

    }

    }

     

     

     

     

     

     

    Demo2:

    package test.thread;

     

    import com.util.LogUtil;

     

     

    public class SynTest2 {

     

    public static void main(String[] args){

    Callme target=new Callme();

    Caller ob1=new Caller(target,"Hello");

    Caller ob2=new Caller(target,"Synchronized");

    Caller ob3=new Caller(target,"World");

    }

    }

     

    class Callme{

     

     

    synchronized void test(){

    LogUtil.log("测试是否是:一旦一个线程进入一个实例的任何同步方法,别的线程将不能

    进入该同一实例的其它同步方法,但是该实例的非同步方法仍然能够被调用");

    }

     

    void nonsynCall(String msg){

    LogUtil.log("["+msg);

    LogUtil.log("]");

    }

     

    synchronized void synCall(String msg){

    LogUtil.logPrint("["+msg);

    LogUtil.log("]");

    }

    }

     

    class Caller implements Runnable{

    String msg;

    Callme target;

    Thread t;

     

    Caller(Callme target,String msg){

    this.target=target;

    this.msg=msg;

    t=new Thread(this);

    t.start();

    }

     

    public void run() {

    // TODO Auto-generated method stub

    //target.nonsynCall(msg);

    target.synCall(msg);

    target.test();

    }

     

    }



    参考自:http://blog.sina.com.cn/s/blog_6af29f290100s7qj.html



    展开全文
  •  线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制,并行执行任务 1.2.3模式  使用GCD主队列.使用NSOperationQueue,把最大线程数(并发)设为1 1.1.1 2.OC中是所有对象间交互是如何...

     1.线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 ,串行执行任务 

     线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制,并行执行任务 1.2.3模式

     使用GCD的主队列.使用NSOperationQueue,把最大线程数(并发)设为1    1.1.1

    2.OC中是所有对象间的交互是如何实现的?

    通过消息发送机制实现    对象---方法

    3.描述上拉加载、下拉刷新的实现机制?

    继承自滚动视图,滚动视图的两个属性offset (x,y)表示偏移量,inset(top,left)当y值未负值的时候,滚动视图的高度--显示视图高度+100(假如偏移100的时候刷新),再次刷新数据.

    4.谈谈对性能优化的看法,如何做?

    懒加载,内存管理,及时释放内存,

    程序后台运行使用推送通知

    渲染 减少次数 (减少显卡使用)

    tableview重用



    展开全文
  • &...区别同步和异步&lt;/strong&gt;   一个进程启动的多个不相干线程,它们相互之间关系为异步。   举个简单例子 就是游戏,游戏会有图像和背景音乐 图像是由玩家操作...
  • 线程的同步和异步的区别 一、同步        所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。是线程同时访问同一资源,等待资源...
  • iOS线程的同步和异步

    2015-03-07 20:20:28
    线程的同步和异步的区别?iOS中如何实现多线程的同步?  1.同步就是说多个任务之间是有先后关系的,一个任务需要等待另一个任务执行完毕后才能执行;  2.异步就是多个任务之间没有先后关系,不需要相互等待,各...
  • 多线程并发时,多个线程同时请求同一个资源,必然导致此资源数据不安全,A线程修改了B线 程处理数据,而B线程又修改了A线程处理数理。显然这是由于全局资源造成,有时为了解 决此问题,优先考虑使用...
  • 异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回 值或消息时,系统会自动触发委托的异步过程,从而完成一个完整流程。同步在一定程度上可以看做是...
  • 同步线程和异步线程的区别

    千次阅读 2019-12-04 18:24:51
    2:异步肯定是个多线程。在客户端请求时,可以执行其他线程,并且在把这个线程存放在他的队列里面,有序的执行。(可以设置线程的数量,当超过最大时会显示等待状态)。 线程同步异步区别 线程同步是多个线程同时...
  • 而这些区别造成了使用多线程和异步操作的时机的区别。  异步操作的本质  所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的...
  • 多线程和异步操作异同 ... 多线程和异步操作两者都可以达到避免调用线程阻塞目的,从而提高软件可响应性。甚至有些时候我们就认为多线程和异步操作是...而这些区别造成了使用多线程和异步操作时机
  • 这里引用其它博主博客,个人感觉不错,原博客地址:https://www.cnblogs.com/daisyforever/p/6013349.html 多线程和异步操作异同 ...但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异...
  • 显然这是由于全局资源造成的,有时为了解决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制...
  • Java --- 线程同步和异步的区别

    万次阅读 多人点赞 2016-12-23 15:23:37
    显然这是由于全局资源造成的,有时为了解决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制...
  • 而这些区别造成了使用多线程和异步操作的时机的区别。  异步操作的本质  所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的
  • 进程和线程的区别 进程是资源的分配调度的一个独立单元,而线程是CPU调度的基本单元 同一个进程中可以包括线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。 进程的...
  • 线程的同步异步

    2016-06-25 08:45:17
    而这些区别造成了使用多线程和异步操作的时机的区别。  异步操作的本质  所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的
  • 1. 同步与异步 无论是线程还是进程,都存在同步和异步的概念。好比一个事情分几个步骤,同步就是一个步骤一个步骤去做,上一个步骤做完再做下一个步骤,有点顺序执行的意思。...这涉及到同步和异步的区别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 874
精华内容 349
关键字:

多线程的同步和异步的区别