A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁世宇 黑马帝   /  2011-11-18 19:45  /  1895 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 袁世宇 于 2011-11-21 13:54 编辑

同步和异步那个是安全的,还有能帮忙举例说明下有那些优缺点吗?

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 面试问题

查看全部评分

5 个回复

倒序浏览
本帖最后由 潜王伟 于 2011-11-18 20:08 编辑

同步是线程安全的。异步不是线程安全的,容易导致死锁,如果一个线程死掉就会导致整个进程崩溃。
但没有同步机制的存在,性能会有所提升。这就是优缺点...(我只知道这些,请大家补充。。。)

例如:

当创建一个Vector对象时候,

Vector ve=new Vector();
ve.add("1");

当在多线程程序中,第一个线程调用修改对象ve的时候,就为其上了锁,其他线程只有等待。

当创建一个ArrayList对象时候,

ArrayList list=new ArrayList();
list.add("1");

当在多线程程序中,第一个线程调用修改对象list的时候,没有为其上锁,其他线程访问时就会报错。

eg:list.remove("1"),然后再由其他线程访问list对象的1时就会报错。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
徐杨 黑马帝 2011-11-18 21:00:45
板凳
同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。
同步的前提:
同步需要两个或者两个以上的线程。
多个线程使用的是同一个锁。
同步的弊端:
当线程相当多时,因为每个线程都会去判断同步上的锁,很浪费资源

异步更有效率 但是安全系数降低

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线

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

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

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

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

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

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

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



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

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



java中实现多线程

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

2)实现runnable接口

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
1.为了防止多个线程并发对同一数据的修改,所以需要同步,否则会造成数据不一致(就是所谓的:线程安全。如java集合框架中Hashtable和Vector是线程安全的。我们的大部分程序都不是线程安全的,因为没有进行同步,而且我们没有必要,因为大部分情况根本没有多线程环境)。
2.同步可以避免出现死锁,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。
异步则是可以提高效率了,现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。
同步和异步最大的区别就在于。一个需要等待,一个不需要等待。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马