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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海洋 中级黑马   /  2013-3-28 22:39  /  1024 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张海洋 于 2013-3-29 09:05 编辑

什么情况下需要线程同步?

3 个回复

倒序浏览
例如访问同一个资源:
例如车站的售票系统,一定是多个线程同时运行售票的吧。
有编号为10000这张票,那么线程thread1正在卖它的时候,其余的线程就不能也卖这张票了。
另一个就是著名的生产者-消费者问题。类比一下,老爸挣钱,打到银行卡里,儿子花钱。(假设卡里有钱的话就暂时不打钱)
对于老爸老说,如果要打钱,查看一下卡,如果有钱,就暂时不放,并通知儿子已经有钱;如果没钱,当然就打钱了。
对于儿子来说,取钱时如果有钱就取,如果没有就等待,并通知老爸没钱了。
这就是同步了。

不知道你理解不?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
制造问题:        {Thread.sleep(10);} catch (Exception e) {}
效果:错票:Thread-0卖 :-2
△问题的原因:
        当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。

△解决办法:
        对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。即synchronized
Java对于多线程的安全问题提供了专业的解决方式。
就是同步代码块:
synchronized(对象)
{
        需要被同步的代码
}
对象如同锁。持有锁的线程可以在同步中执行。
没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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