java中的同步和异步的异同

java中的同步和异步的异同

ID:34417106

大小:27.07 KB

页数:4页

时间:2019-03-05

java中的同步和异步的异同_第1页
java中的同步和异步的异同_第2页
java中的同步和异步的异同_第3页
java中的同步和异步的异同_第4页
资源描述:

《java中的同步和异步的异同》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、http://www.mybdqn.com/java中的同步和异步的异同如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取.当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率.Java同步:基本概念:每个Object都会有1个锁.同步就是串行使用一些资源.(说明:以下有些例子为了突出重点,省略了不必要的代码.非凡是省掉了一些成员变量,就是需要同步的对象.)1.多线

2、程中对共享、可变的数据进行同步.对于函数中的局部变量没必要进行同步.对于不可变数据,也没必要进行同步.多线程中访问共享可变数据才有必要.2.单个线程中可以使用synchronized,而且可以嵌套,但无意义.classTest{publicstaticvoidmain(String[]args){Testt=newTest();synchronized(t){synchronized(t){System.out.println("ok!");}}}}3.对象实例的锁classTest{publicsynchronizedvoidf1(){//dosomethi

3、nghere}publicvoidf2(){synchronized(this){//dosomethinghere}}}上面的f1()和f2()效果一致,synchronized取得的锁都是Test某个实列(this)的锁.比如:Testt=newTest();线程A调用t.f2()时,线程B无法进入t.f1(),直到t.f2()结束.作用:多线程中访问Test的同一个实例的同步方法时会进行同步.4.class的锁http://www.mybdqn.com/classTest{finalstaticObjecto=newObject();publicstat

4、icsynchronizedvoidf1(){//dosomethinghere}publicstaticvoidf2(){synchronized(Test.class){//dosomethinghere}}publicstaticvoidf3(){try{synchronized(Class.forName("Test")){//dosomethinghere}}catch(ClassNotFoundExceptionex){}}publicstaticvoidg(){synchronized(o){//dosomethinghere}}}上面f1(),

5、f2(),f3(),g()效果一致f1(),f2(),f3()中synchronized取得的锁都是Test.class的锁.g()是自己产生一个对象o,利用o的锁做同步作用:多线程中访问此类或此类任一个实例的同步方法时都会同步.singleton模式lazilyinitializing属于此类.5.staticmethodclassTest{privatestaticintv=0;publicstaticvoidf1(){//dosomething,但函数中没用用到v}publicsynchronizedstaticvoidf2(){//dosomethin

6、g,函数中对v进行了读/写.}}多线程中使用Test的某个实列时,(1)f1()是线程安全的,不需要同步(2)f2()这个静态方法中使用了函数外静态变量,所以需要同步.http://www.mybdqn.com/Java异步:一.它要能适应不同类型的请求:本节用makeString来说明要求有返回值的请求.用displayString来说明不需要返回值的请求.二.要能同时并发处理多个请求,并能按一定机制调度:本节将用一个队列来存放请求,所以只能按FIFO机制调度,你可以改用LinkedList,就可以简单实现一个优先级(优先级高的addFirst,低的addL

7、ast).三.有能力将调用的边界从线程扩展到机器间(RMI)四.分离过度耦合,如分离调用句柄(取货凭证)和真实数据的实现.分离调用和执行的过程,可以尽快地将调返回.现在看具体的实现:publicinterfaceAxman{ResultresultTest(intcount,charc);voidnoResultTest(Stringstr);}这个接口有两个方法要实现,就是有返回值的调用resultTest和不需要返回值的调用noResultTest,我们把这个接口用一个代理类来实现,目的是将方法调用转化为对象,这样就可以将多个请求(多个方法调)放到一个容器

8、中缓存起来,然后统一处理,因为Java

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。