黑马程序员技术交流社区

标题: 线程 [打印本页]

作者: zbgl    时间: 2013-11-18 23:39
标题: 线程
线程如何进行同步处理,?同步方法和代码块如何区别?我有点分不清

作者: 陈文杰    时间: 2013-11-18 23:45
线程的同步就相当于只有一个浴室(共用资源)。但是很多人要洗澡(线程),所以为了避免同一时间段有多人拥入浴室,在一个人进入浴室的时候把门锁起来,这样其他人只能等待,等那人洗好开了门才能进入下一个

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

代码块级同步:
- 临界区:需要进行互斥的代码段,而非整个方法。
- 实现方法:用synchronized来指定某个对象,此对象的锁被用来对花括号内的代码进行同步控制。
- 实现原理:在进入同步代码前,必须得到object对象的锁,如果其他线程已经得到这个锁,那么就得等到锁被释放后才能进入临界区。
- 锁的作用域:只在代码块运行的时间内。
作者: ″先森丶玹°    时间: 2013-11-18 23:55
唯一的区别就是方法块是显式的指明锁对象
而同步方法是用的是默认的锁对象,成员方法的锁是this,静态方法的锁是class对象
如何同步:
同步代码块:

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

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

理解了!你是哪一期的?
作者: FFF    时间: 2013-11-19 00:45
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~
作者: 陈文杰    时间: 2013-11-19 00:49
zbgl 发表于 2013-11-19 00:43
理解了!你是哪一期的?

我在准备2014春节过完再来,下下下期吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2