`
youfengkai
  • 浏览: 26851 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

同步和异步

阅读更多
如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取.

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率.


 

    Java同步:

    基本概念:

    每个Object都会有1个锁.

    同步就是串行使用一些资源.

    (说明:以下有些例子为了突出重点,省略了不必要的代码.非凡是省掉了一些成员变量,就是需要同步的对象.)

    1. 多线程中对共享、可变的数据进行同步.

    对于函数中的局部变量没必要进行同步.

    对于不可变数据,也没必要进行同步.

    多线程中访问共享可变数据才有必要.

    2. 单个线程中可以使用synchronized,而且可以嵌套,但无意义.

    class Test {

    public static void main(String[] args) {

    Test t = new Test();

    synchronized(t) {

    synchronized(t) {

    System.out.println("ok!");

    }

    }

    }

    }

    3. 对象实例的锁

    class Test{

    public synchronized void f1(){

    //do something here

    }

    public void f2(){

    synchronized(this){

    //do something here

    }

    }

    }

    上面的f1()和f2()效果一致, synchronized取得的锁都是Test某个实列(this)的锁.

    比如: Test t = new Test();

    线程A调用t.f2()时, 线程B无法进入t.f1(),直到t.f2()结束.

    作用: 多线程中访问Test的同一个实例的同步方法时会进行同步.

    4. class的锁

    class Test{

    final static Object o= new Object();

    public static synchronized void f1(){

    //do something here

    }

    public static void f2(){

    synchronized(Test.class){

    //do something here

    }

    }

    public static void f3(){

    try {

    synchronized (Class.forName("Test")) {

    //do something here

    }

    }

    catch (ClassNotFoundException ex) {

    }

    }

    public static void g(){

    synchronized(o){

    //do something here

    }

    }

    }

    上面f1(),f2(),f3(),g()效果一致

    f1(),f2(),f3()中synchronized取得的锁都是Test.class的锁.

    g()是自己产生一个对象o,利用o的锁做同步

    作用: 多线程中访问此类或此类任一个实例的同步方法时都会同步. singleton模式lazily initializing属于此类.

    5. static method

    class Test{

    private static int v = 0;

    public static void f1(){

    //do something, 但函数中没用用到v

    }

    public synchronized static void f2(){

    //do something, 函数中对v进行了读/写.

    }

    }

    多线程中使用Test的某个实列时,

    (1) f1()是线程安全的,不需要同步

    (2) f2()这个静态方法中使用了函数外静态变量,所以需要同步.

     Java异步:

    一.    它要能适应不同类型的请求:

    本节用 makeString来说明要求有返回值的请求.用displayString来说明不需要返回值的请求.

    二.    要能同时并发处理多个请求,并能按一定机制调度:

    本节将用一个队列来存放请求,所以只能按FIFO机制调度,你可以改用LinkedList,就可以简单实现一个优先级(优先级高的addFirst,低的addLast).

    三.    有能力将调用的边界从线程扩展到机器间(RMI)

    四.    分离过度耦合,如分离调用句柄(取货凭证)和真实数据的实现.分离调用和执行的过程,可以尽快地将调返回.

    现在看具体的实现:

    public interface Axman {

    Result resultTest(int count,char c);

    void noResultTest(String str);

    }

    这个接口有两个方法要实现,就是有返回值的调用resultTest和不需要返回值的调用

    noResultTest, 我们把这个接口用一个代理类来实现,目的是将方法调用转化为对象,这样就可以将多个请求(多个方法调)放到一个容器中缓存起来,然后统一处理,因为 Java不支持方法指针,所以把方法调用转换为对象,然后在这个对象上统一执行它们的方法,不仅可以做到异步处理,而且可以将代表方法调用的请求对象序列化后通过网络传递到另一个机器上执行(RMI).这也是Java回调机制最有力的实现.

    一个简单的例子.

    如果 1: 做A

    如果 2: 做B

    如果 3: 做C

    如果有1000个情况,你不至于用1000个case吧?以后再增加呢?

    所以如果C/C++程序员,会这样实现: (c和c++定义结构不同)

    type define struct MyStruct{

    int mark;

    (*fn) ();

    } MyList;

    然后你可以声明这个结构数据:

    {1,A,

    2,B

    3,C

    }

    做一个循环:

    for(i=0;i<length;i++) {

    if(数据组[i].mark == 传入的值) (数据组[i].*fn)();

    }

    简单说c/c++中将要被调用的涵数可以被保存起来,然后去访问,调用,而Java中,我们无法将一个方法保存,除了直接调用,所以将要调用的方法用子类来实现,然后把这些子类实例保存起来,然后在这些子类的实现上调用方法:

    interface My{

    void test();

    }

分享到:
评论

相关推荐

    C#TCP/IP同步和异步通信

    本文将深入探讨如何在C#编程环境中实现TCP/IP的同步和异步通信,并结合提供的“WindowsInternetServer”压缩包文件,讲解如何封装这两种通信方式。 首先,TCP/IP同步通信是指在发送数据前,必须等待接收方确认接收...

    C#Udp同步和异步编程源代码

    C#作为.NET框架的主要编程语言,提供了丰富的API来处理网络通信,其中包括UDP(User Datagram Protocol)协议的同步和异步编程。本文将深入探讨C#中如何实现UDP同步和异步编程,并提供相关知识点。 首先,UDP是一种...

    C# 同步与异步读写

    在编程领域,尤其是在高性能和高并发的场景下,理解和掌握同步与异步读写是非常关键的。C#作为微软开发的面向对象的编程语言,提供了丰富的API和特性来支持这两种操作模式。本篇文章将深入探讨C#中的同步与异步读写...

    同步和异步串口

    同步和异步串口 同步和异步串口是两种常用的串行通信方式,它们都是基于 RS232C 方式的体现,但它们的传输方式不同。异步传输是一种典型的基于字节的输入输出,指数据按每次一个字节进行传输,其传输速度较低。同步...

    C# Socket 同步和异步通信

    本篇将详细探讨C#中的Socket同步和异步通信,以及如何在Winform环境下实现这些功能。 首先,我们要理解什么是Socket。Socket,也称为套接字,是操作系统提供的网络编程接口,用于建立和维护网络连接,进行数据交换...

    同步和异步FIFO.zip

    同步和异步FIFO是数字电路设计中的重要概念,特别是在微处理器、嵌入式系统以及通信接口等领域的应用中。FIFO(First In First Out,先进先出)是一种特殊的存储结构,它按照数据进入的顺序进行存储,并按照数据进入...

    同步和异步的NSOperation的Demo

    在本Demo中,我们将深入探讨同步和异步操作的区别以及如何在实践中运用NSOperation。 首先,NSOperation是一个抽象基类,它代表一个可执行的任务或者操作。你可以通过继承NSOperation来创建自定义的操作类,或者...

    C# socket同步和异步通信示例

    本示例主要探讨了C#中Socket的同步和异步通信方式,这对于开发网络应用,尤其是服务端和客户端之间的数据交换至关重要。下面将详细解释这两种通信方式以及它们的应用场景。 1. **同步通信**: 同步通信是指发送方...

    同步和异步的套接字模块源码

    在"同步异步套接字.e"这个源码文件中,可能包含了同步和异步套接字的实现细节,比如如何创建套接字,如何进行连接,如何发送和接收数据等。通常,它会使用特定的API来设置套接字为同步或异步模式,例如在POSIX系统中...

    C# socket winform 同步和异步通信 点对点通信 聊天 互相学习

    C# socket winform 同步和异步通信。 只供个人学习。 请不要发布到网上,纯手工制作。 同步:socket通信,客户端是WinCe项目,Windows上也可以运行,需要打开exe.不能在解决方案中调试。 异步:公共通信类 ...

    java中的同步和异步的异同共4页.pdf.zip

    Java中的同步和异步是两种不同的处理方式,它们在多线程编程中起着至关重要的作用,尤其是在构建高效、响应迅速的应用程序时。同步和异步的主要区别在于它们如何管理和控制对资源的访问以及任务的执行顺序。 同步...

    同步和异步FIFOVerilog源码

    在Verilog中,我们可以用硬件描述语言来实现同步FIFO和异步FIFO。 同步FIFO是指读写指针由同一个时钟域控制,这种设计简单,但不适用于处理跨时钟域问题。同步FIFO的Verilog实现主要关注的是读写指针的管理和满空...

    实现同步和异步下载网络图片

    本文将深入探讨如何实现同步和异步下载网络图片,并将其显示在UIImageView中,以提高用户体验。 首先,我们来理解同步与异步的概念。同步操作意味着程序会等待任务完成后再继续执行后续代码,而异步操作则允许程序...

    socket同步和异步编程实例(C#)

    本实例主要关注的是同步和异步两种编程模式,这两种模式在处理并发连接和数据传输时有着显著的区别。 首先,同步Socket编程是一种阻塞式操作。在发送或接收数据时,程序会暂停执行,直到数据传输完成。例如,当一个...

    Socket同步和异步简介文档

    "Socket同步和异步简介文档" 在计算机网络编程中,Socket 是一种常用的通信机制,它允许不同的进程或线程之间进行通信。在 Socket 编程中,同步和异步是两个非常重要的概念,它们决定了通信的方式和效率。 同步...

    同步和异步复位的知识

    ### 同步和异步复位的知识 #### 一、引言 在数字电路设计中,复位(Reset)机制是确保系统初始化和错误恢复的关键组成部分。根据复位信号是否与系统时钟同步,可以将复位分为同步复位和异步复位两种类型。这两种...

    网络游戏-在同一个网络上调度同步和异步分组的方法和系统.zip

    《网络游戏-在同一个网络上调度同步和异步分组的方法和系统》 网络游戏,作为现代数字娱乐的重要组成部分,其核心技术之一就是如何有效地处理网络中的同步和异步问题。本资料详细探讨了在同一个网络上,如何高效地...

    Redis 和 Redis Sentinel (2.8) 的 .NET 客户端 包括同步和异步客户端 .zip

    包括同步和异步客户端。csredisCSRedis 是 Redis 和 Redis Sentinel (2.8.12) 的 .NET 客户端。包括同步和异步实现。安装 CSRedis 的最简单方法是通过包管理器控制台从NuGet安装PM&gt; 安装包 csredis基本用法只要有...

Global site tag (gtag.js) - Google Analytics