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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zbgl 中级黑马   /  2013-11-18 23:39  /  1643 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程如何进行同步处理,?同步方法和代码块如何区别?我有点分不清

6 个回复

倒序浏览
线程的同步就相当于只有一个浴室(共用资源)。但是很多人要洗澡(线程),所以为了避免同一时间段有多人拥入浴室,在一个人进入浴室的时候把门锁起来,这样其他人只能等待,等那人洗好开了门才能进入下一个

实现的话就是给你线程中访问共用资源的代码段加上
public void run()
{
   synchronized(Object)//括号内为监听的共用资源对象名,注意是对象不是类
   {
//改变共用资源的语句
   }
}
方法级同步:
- 实现方法:在要标志为同步的方法前加上synchronized关键字。
- 实现原理:当调用对象的同步方法时,线程取得对象锁或监视器;如果另一个线程试图执行任何同步方法时,他就会发现他被锁住了,进入挂起状态,直到对象监视器上的锁被释放时为止。当锁住方法的线程从方法中返回时,只有一个排队等候的线程可以访问对象。

代码块级同步:
- 临界区:需要进行互斥的代码段,而非整个方法。
- 实现方法:用synchronized来指定某个对象,此对象的锁被用来对花括号内的代码进行同步控制。
- 实现原理:在进入同步代码前,必须得到object对象的锁,如果其他线程已经得到这个锁,那么就得等到锁被释放后才能进入临界区。
- 锁的作用域:只在代码块运行的时间内。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 山寨

查看全部评分

回复 使用道具 举报
唯一的区别就是方法块是显式的指明锁对象
而同步方法是用的是默认的锁对象,成员方法的锁是this,静态方法的锁是class对象
如何同步:
同步代码块:

synchronized(对象){                //对象为锁,
                需要被同步的代码
}

同步函数:this是锁
public synchronized void xxx(){
需要被同步的代码
}
回复 使用道具 举报
同步方法只要在返回值类型前面加synchronized,对应对象为this
同步代码块 只需要将同步的内容放进代码块中,对应对象为任意对象
当多个方法调用同一数据,需要同步时,对象需要相同的
同步方法就是放在方法上的 对象为隐藏的
同步方法
public void synchronized main(){
}
代码块则是synchronized(this){
}
回复 使用道具 举报
陈文杰 发表于 2013-11-18 23:45
线程的同步就相当于只有一个浴室(共用资源)。但是很多人要洗澡(线程),所以为了避免同一时间段有多人拥 ...

理解了!你是哪一期的?
回复 使用道具 举报
FFF 金牌黑马 2013-11-19 00:45:15
地板
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~
回复 使用道具 举报
zbgl 发表于 2013-11-19 00:43
理解了!你是哪一期的?

我在准备2014春节过完再来,下下下期吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马