基本的线程同步块 只是使用对象 不存在你说的什么类锁(这里 先不讨论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保证是唯一一个 这样 锁定的效果就影响所有静态的同步方法
----------------------------------------------------------------
分享到:
相关推荐
synchronized 方法的缺陷是:同一个对象的不同线程之间会形成互斥,而对这个对象所属的 Class 所产生的另一对象却可以任意调用这个被加了 synchronized 关键字的方法。 synchronized 块 除了方法前用 synchronized...
对象锁是针对类的实例对象而言的,当一个线程访问某个对象的非静态 synchronized 方法或同步代码块时,会获取到该对象的锁。这种锁确保了同一时间只有一个线程能访问该对象的成员变量。例如: ```java public class...
标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`synchronized`关键字创建互斥锁,确保同一时间只有一个线程可以访问特定的代码块或方法。 描述中的"一个多线程访问的同...
1. 对于类的实例方法,如果一个线程正在执行某对象的`synchronized`实例方法,其他线程不能通过同一个对象调用该方法,但可以通过其他对象实例调用。 2. 类的静态方法被`synchronized`修饰时,它会锁定类的Class对象...
当多个线程尝试访问同一共享资源时,`synchronized`可以确保同一时间只有一个线程能访问该资源,从而防止数据不一致。通过结合使用这些方法和关键字,开发者可以有效地控制线程的执行顺序,实现更复杂的并发控制策略...
- 如果一个线程正在访问对象的`synchronized(this)`同步代码块,其他线程仍然可以访问该对象的非`synchronized(this)`代码块。例如: ```java package ts; public class Thread2 { public void m4t1() { ...
同时,Synchronized 代码块也可以在一定时期内霸占某个对象的钥匙,避免其他线程访问该对象的上锁房间。 Synchronized 的使用原则 Synchronized 的使用原则是“随用随借,用完即还”。但是,在某些情况下,可能...
4. 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。
2. **可重入性**:一个线程已经获得了某个对象的锁,它还可以再次获取该对象的其他`synchronized`代码块或方法的锁,这就是所谓的可重入性。这不会导致死锁,因为线程自己可以释放锁。 3. **同步作用域**:`...
当一个线程进入synchronized代码块或方法时,它会获取与该代码块或方法关联的对象锁。其他尝试进入相同代码块或方法的线程将被阻塞,直到当前线程执行完毕并释放锁。这样可以确保在任何给定时刻,只有一个线程能够...
锁定的对象、方法或代码块只能由一个线程访问,其他线程必须等待当前线程释放锁定后才能访问。 wait()和notify()方法可以用来切换线程状态。wait()方法使当前线程等待,直到其他线程调用notify()方法唤醒当前线程...
当一个线程进入synchronized方法或代码块时,其他试图访问同一对象的线程会被阻塞,直到该线程执行完毕并释放锁。例如,`public synchronized void method()`就是一个同步方法。 2. **wait()、notify()和notifyAll...
* 若此对象对应的类中包含了多个 synchronized 修饰的方法或代码块,多个线程访问同一个对象的任意 synchronized 修饰的方法或代码块,只要有一个线程拥有了 synchronized 同步锁,其他线程不管想访问 synchronized ...
例子二展示了即使在一个线程执行`synchronized(this)`代码块时,其他线程仍可以访问同一个对象中的非`synchronized`方法。线程A执行`synchronized`方法`m4t1()`,线程B可以同时执行非`synchronized`方法`m4t2()`。 ...
Monitor类提供了Enter和Exit方法来获取和释放对象锁,确保同一时间只有一个线程能访问受保护的代码块,即临界区。与lock语句类似,但Monitor提供更多的灵活性,如TryEnter尝试获取锁、Wait使当前线程等待、Pulse和...
1. 方法同步:通过在方法声明前加上`synchronized`关键字,整个方法体将被锁定,一次只有一个线程可以执行该方法。例如: ```java public synchronized void method() { // 代码 } ``` 2. 代码块同步:针对特定...
一个简单的多线程代码示例,Java实现,用于实现同一时刻,只允许一个线程调用执行的代码块或类,即synchronized的如何使用(多线程实现),实现 Runnable
这意味着,当一个线程进入一个对象的同步代码块后,其他试图进入该同步代码块的线程会被阻塞,直到该线程完成并释放锁。这个特性确保了同一时刻对于一个特定对象,其同步代码只能被一个线程执行,从而防止数据的不...