黑马程序员技术交流社区

标题: java 线程锁synchronized应用技巧 [打印本页]

作者: 欧阳超    时间: 2011-10-5 22:55
标题: java 线程锁synchronized应用技巧
谁来解释一下
作者: 匿名    时间: 2011-10-5 23:18
同步的原理:
   其实就是使用锁机制。
   将多条操作共享资源的代码进行同步的封装,并加了锁。
   只有获取到锁线程才可以进入到同步中,这时其他线程即使获取到执行权。
   因为没有了锁,它们都进不来。这样就保证了数据的安全。解决了线程安全问题。
什么代码需要定义到同步中呢?
   只有操作了共享数据的多条代码才放到同步中。
   同步的好处:解决了线程安全问题。
   同步的弊端:对资源是一种耗费,相对降低效率。
同步的前提:
   1,必须是两个或者两个以上的线程才需要同步。
   2,多个线程必须使用同一个锁,才可以成为这些线程被同步了。
   解决思想:在一个时间段,对于多条执行共享资源的语句,必须由一个线程执行完。
   在执行过程中,其他线程不可以参与。
总结:造成安全隐患的因素
   1,多个线程在操作共享资源。
   2,有多条操作共享资源的代码。
作者: 盖保宁    时间: 2011-10-6 12:02
就是实现代码块的原子操作了  我是这么理解的  通过synchronized可以使  两个函数互斥访问临界资源  
作者: zhousaowen    时间: 2011-10-6 12:22
本帖最后由 zhousaowen 于 2011-10-6 12:29 编辑

一个线程能否进入已有线程的方法分几种情况:
1.其他方法前是否加了synchronized关键字,如果没加,则能。
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。

synchronized使用地方及其使用的对象:
内部代码对象可以为this或者其他的对象:
public void  code(){
  Synchronized(this){}
}
在静态方法中的对象为字节码
public static synchroinized void code(){//xxxclass.class
}
在方法对象为this
public synchronized void code(){
}
作者: 刘朋朋    时间: 2011-10-6 17:47
一个线程能否进入已有线程的方法分几种情况:

分几种情况:
     1.其他方法前是否加了synchronized关键字,如果没加,则能。
     2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
     3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
     4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。
作者: 王家虎    时间: 2011-10-6 23:28
synchronized表示的就是锁。当一个方法上有synchronized时就表示这个方法在被一个线程执行时被锁上了,此时若其他线程也来执行这个方法,那么它看见这个方法被“上锁”了,自己就进不去了。只有当那个在执行这个方法线程“办完了事情”之后把锁打开自己出来后在等待的线程才可以进入这个方法。




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