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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zclove898 高级黑马   /  2011-12-15 00:49  /  3746 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zclove898 于 2011-12-15 22:48 编辑

在多线程中,什么时候要用到同步代码块,同步代码块的具体作用是什么

评分

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

查看全部评分

5 个回复

倒序浏览
本帖最后由 熊明春 于 2011-12-15 01:29 编辑

当多个线程操作同一资源时,需要用到同步代码块,作用就是为保证资源操作的合理正确性,比如:
卖票,有多个售票窗口(多个线程),卖票动作的代码在底层一次只能被请求买一张票(因为要处理好票号的问题(资源问题))
  买票动作就需要同步代码块,保证资源处理的正确性!

评分

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

查看全部评分

回复 使用道具 举报
简单的说就是为了解决多线程运行时出现的安全性问题。
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。
对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。
java对于多线程的安全性问题提供了专业的解决方式。就是同步代码块。
synchronized(对象)
{
        需要被同步的代码
}
对象如同锁。持有锁的线程可以在同步中执行,没有持有锁的线程,即使获取了CPU的执行权也进不去,因为没有获取锁。

评分

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

查看全部评分

回复 使用道具 举报
同步代码块只有在多线程共享一段数据出现安全问题时会用到。
当多个线程共享一段数据时,获得CPU执行权的线程都可执行共享数据,而此时很有可能出现另一线程已经开始执行但并未执行完该段共享数据,由此就会产生安全问题。
使用同步代码块就是用来解决这一问题的,他可以保证当一个线程在执行完共享代码块过程中,即使没有CPU执行权,其它线程也不可以执行,只有当该线程执行
共享代码块结束以后,其它线程才能开始执行共享代码块。

评分

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

查看全部评分

回复 使用道具 举报
何时需要同步:解决第一个问题
在多个线程同时访问互斥(可交换)数据时,应该同步以保护数据,确保两个线程不会同时修改更改它。 对于非静态字段中可更改的数据,通常使用非静态方法访问。对于静态字段中可更改的数据,通常使用静态方法访问。
同步作用总结:解决第二个问题
、线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏。2、线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他非同步方法。3、对于静态同步方法,锁是针对这个类的,锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁,当在一个同步方法中访问另外对象上的同步方法时,会获取这两个对象锁。4、对于同步,要时刻清醒在哪个对象上同步,这是关键。5、编写线程安全的类,需要时刻注意对多个线程竞争访问资源的逻辑和安全做出正确的判断,对“原子”操作做出分析,并保证原子操作期间别的线程无法访问竞争资源。6、当多个线程等待一个对象锁时,没有获取到锁的线程将发生阻塞。7、死锁是线程间相互等待锁锁造成的,在实际中发生的概率非常的小。真让你写个死锁程序,不一定好使,呵呵。但是,一旦程序发生死锁,程序将死掉。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
好纠结的问题的说
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马