黑马程序员技术交流社区

标题: java的同步问题 [打印本页]

作者: 韩军博    时间: 2011-12-12 22:59
标题: java的同步问题
本帖最后由 韩军博 于 2011-12-13 11:21 编辑

synchronized 这个关键字锁住变量和锁住方法   都说是前者好,但是这是为什么?
作者: t_mac    时间: 2011-12-12 23:18
本帖最后由 t_mac 于 2011-12-12 23:20 编辑

synchronized能锁住变量?
好像只能锁住方法或者是方法中的代码块吧,应该是说锁住代码块比锁住一个大的方法要好
因为,将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。
synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized(syncObject) {
//允许访问控制的代码
}
  synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (可以是类实例或类)的锁方能执行,由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
作者: 余松霖    时间: 2011-12-12 23:43

synchronized 这个关键字锁住变量和锁住方法   都说是前者好,但是这是为什么?

这是毕老师懒汉式单例类讲解里边的    你是的意思是说为什么锁住方法里边的代码块比直接锁住方法好吧

直接锁住方法相对于前者比较低效一些.  想要执行方法里边的内容每次都要判断这个锁.
而锁住里边的代码块读锁的次数减少,也就是说效率提高!
所以说前者更好!

作者: 常文艺    时间: 2011-12-13 10:40
看需求了,能不读锁尽量不读锁,毕老师单例懒汉式里锁放在方法上每次都要先读锁然后再判断,定义在里面后只读一次锁,实例创建后就不用读锁了,少了一步,这样提高了代码的运行效率。




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