`
jiagyao
  • 浏览: 95550 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一个线程进入一个对象的一个synchronized方法,其他线程是否还可以进入该对象的其他方法

JVM 
阅读更多
基本的线程同步块 只是使用对象 不存在你说的什么类锁(这里 先不讨论JDK1.5的同步工具包里面的那个Lock 就说synchronized 块) static同步方法是用的是当前类的Class对象(java.lang.Class 这个对象在做反射的时候)

也就是说
---------------------------------
一种是对象锁,类A中同步块和f1(),共用对象锁,所以当他们中的任一被锁,其他线程就不能访问另一个方法或同步块。至于其他方法是否能访问?我还是不清楚。
---------------------------------
如果是非静态的同步方法 使用的锁对象就是this 也就是当前对象 你使用同步块的话 关键不是看你的同步块写在哪个类里面 而是看他用的是哪个对象来锁定
另一种是类锁,静态同步方法都使用类锁,所以当一个类中的一个静态同步方法被锁,其他线程无法访问其他静态同步方法,至于其他方法能否访问?我还是不清楚。
---------------------------------
只要没有同步修饰 那么就和他们无关 不知道是不是你对同步块的理解有问题 疑问他锁的到底是什么东西 举个例子

synchronized (object){
}
就相当于你面前有道门 这个门要你必须要用object这个对象作为钥匙来开 所以 你就必须要获得这个钥匙 如果线程1进入这个同步块了 那么钥匙就被他一并带进去了 其他的线程要进入的话 就必须要等线程1出来
作为锁(或者说是钥匙)的这个object和你的同步块写在什么类里面是没有关系的 如果你有类A和类B各自有一个同步块 都是使用的是同一个对象(注意这里强调同一个对象) 作为锁的话 线程1进入类A同步块 这个时候 类B的这个同步块也会被锁掉 就相当于是 你的家门钥匙和你公司办公室的钥匙是同一把 要是你同事把你的钥匙拿去了 那你即进不了办公室 也进不了家门了一样的 但是 不代表你进不了公司茶水间 因为茶水间就没有锁

-----------------------------------------------------------------
同步块的基本形式是

synchronized (object) {
    // DO Something
}


这成为使用object来锁定这一段代码 一旦有线程进入这一个代码块中 那么其他的线程就无法进入用同一个对象锁定的代码(包括这个同步块本身和 其他使用这个对象的synchronized (object) 都无法进入)

而如果一个类A 有一个方法为

public synchronized void fun()


那么就等同于用this 也就是这个对象自身来锁定这个方法的代码 那么 一旦有线程进入这个方法 类的所有非静态(注意 是非静态 静态方法下面再说)的同步方法 以及其他的用这个对象锁定的代码都无法进入


public synchronized static funStatic()


静态方法比较特殊 因为不存在有this 当前对象这个说法 所以 他使用的锁对象是 A.class 也就是 这个类的Class对象 他在JVM上由JVM保证是唯一一个 这样 锁定的效果就影响所有静态的同步方法
----------------------------------------------------------------
分享到:
评论
4 楼 tf03172003 2009-09-10  
根本没有解答问题
3 楼 jiagyao 2009-04-15  
突然我看的也有点晕
2 楼 jiagyao 2009-02-06  
呵呵,我表达上可能有问题吧,不过兄弟静下心再看看应该能理解
1 楼 PlayGod1984 2009-02-04  
看不懂你说的

相关推荐

Global site tag (gtag.js) - Google Analytics