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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王建亮 中级黑马   /  2014-3-11 21:48  /  1396 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王建亮 于 2014-3-12 11:13 编辑

为什么说实现同步的程序是安全的但效率却低,而非同步的程序效率高但却不安全?

7 个回复

倒序浏览
同步的意思就是说一个资源当前正由一个进程使用,而其他的进程程序都必须等这个进程用完之后才能用,也就是说每次只能有一个进程使用该资源,同步的好处就是当资源改变属性,之后使用它的进程都会知道。而非同步允许多个进程同时使用一个资源,所以说效率高,但也带来了不安全因素,比如有两个进程正在使用同一个资源,其中一个改变了资源的属性,而另一个进程却仍然使用的是没有改变属性的资源。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
同步加锁需要判断,增加了计算机的运算量。不同步不需要锁,多值传输时极有可能会造成数据参杂的现象。
回复 使用道具 举报
因为同步的线程都是加锁的,每次执行都得判断锁的问题,而且是执行一个就必须执行完在执行另一个;非同步直接正常运行就好效率是高,但是像银行金融项目还是一定要用同步的线程;
回复 使用道具 举报
首先说一下同步的原理,同步其实就是把一段程序给加锁,无论有多少程序要运行首先都有先检查一些有没有加锁,若有锁其他的线程就必须等待,而非同的不是这样,只要自己抢到cpu的执行权就可以所以效率高但是容易造成混乱。
回复 使用道具 举报
使用syn关键字,我认为效率低下的原因,不仅仅是其他线程需要等待,而且是因为
第一、需要底层调用。这应该就是concurrent包出现的原因。
第二、其他线程在等待的时候,需要挂起和唤醒,这个挂起和唤醒的动作只有操作系统才能做。也就是需要操作系统的帮忙,也就是说程序需要从用户态转换为核心态。这就无疑加重了应用的负担。
回复 使用道具 举报
打个比方,如果你在等一个人,

同步的时候,你会一直等到她来了之后才做其他事情,这个过程除了等待你啥都不会做,异步的时候,你一边在等,可能一边玩游戏或者是看报纸什么的,一直到她到来,你的等待状态才会结束

在实现上,同步的过程会阻塞进程的所有其他操作,将同步转换为异步的最常见方法则是将会阻塞进程的等待操作放入到一个新的进程中,同时为该等待操作添加一个监视器,在检测到等待操作完成的时候结束等待的进程。
回复 使用道具 举报
同步的意思就是加锁后,其他线程不能进来除非锁里面的线程运行完了才给其他线程的cpu的执行权。所以很显然当其他线程过来抢夺CPU执行权时先要判断锁是不是开着的,这无形中增加了CPU的运算量,所以效率底。但是凡事有弊就有利,虽然同步后效率低了,但安全性却大大提升了,当有共享数据时,其他线程就不会干扰共享数据,出现结果错乱的问题。讲的这么空乏,不如下面给你个事例阿:
class Demo
{
synchronized(this)//锁,每次线程运行都要判断,效率低但安全,不会出现共享数据的混乱
  {
   int x=1://共享数据
   x=x+1;
}
System.out.println(x);
}

class Test
{
Demo d=new Demo();
//建立两个线程并运行
Thread t1=new Thread(d);
Thread t2=new Thread(d);
t1.start();
t2.start();
}

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马