黑马程序员技术交流社区

标题: 求教一个同步代码块的小问题 [打印本页]

作者: 李平    时间: 2012-4-18 21:46
标题: 求教一个同步代码块的小问题
同步代码块:
    synchonized(对象)
    {
          需要被同步的代码块;
    }
那个对象的位置应该放什么??
老师用的是Object obj = new Object();的obj。为什么用这个就行?
但是以后所有的都有用这个吗,还是有其他的??

作者: liuyang    时间: 2012-4-18 21:51
可以是任何对象,只要保证在你需要同步的地方使用的是同一个对象。
作者: 黑马罗坚    时间: 2012-4-18 21:54
锁不一定要放Object对象 所有的对象都可以放   如this   你也可以专门创建一个对象来当锁用 它只是利用对象的状态 跟对象本身没关系。需要注意下同步嵌套的死锁问题。。
作者: 黑马—王宁    时间: 2012-4-18 22:03
所有的对象都可以放.
作者: 黑马罗坚    时间: 2012-4-18 22:35
关键字小写 不是synchonized而是 synchronized
synchronized(this){}(非静态方法中)  当地1个线程(线程1)执行到这句话时检测this的同步锁状态 这是为没锁 可以继续往下执行 当执行完这句话时 this的状态为已锁 如果这是切换到别的线程时当执行到这句话检测this的状态发现已锁卡在这将切换线程 当线程1执行完同步代码块时锁状态为开 其他的线程才可以进入同步代码块中 并且锁状态为已锁
当嵌套同步代码块时  不能用同把锁否则死锁 如
synchronized(this){
        synchronized(this){
}
}
当地1个线程即线程1执行完地1行代码时 this状态将为已锁 执行到地2行时  判断this状态 发现已锁将卡在这里 其他线程也将卡在第一行
synchronized(this){
}
synchronized(this){
}

可以用2把不同的锁解决该问题

synchronized(this){
        String s=new String();
        synchronized(s){
        }
}




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