今天没事研究了一下,java线程的同步,其中的一个关键字synchronized,总结一下,以备以后查看:
1、如果synchronized加在一个类的普通方法上,那么相当于synchronized(this),锁是当前实例对象。
2、如果synchronized加在一个类的静态方法上,那么相当于synchronized(Class对象),锁是当前对象的Class对象。
synchronized(class)很特别,它会让另一个线程在任何需要获取class做为monitor的地方等待。class与this作为不同的监视器可以同时使用,不存在一个线程获取了class,另一个线程就不能获取该class的一切实例。
3、如果synchronized加在同步方法块中,锁是Synchonized括号里配置的对象。
4、我们可以把对象标志位(0或1)看成一个监视器,当一个线程执行到synchronized代码块的时候会检查监视器的 。
5、class与this的几种情况:
synchronized(class)
synchronized(this)
线程各自获取monitor,不会有等待。
synchronized(this)
synchronized(this)
如果不同线程监视同一个实例对象,就会等待;如果不同的实例,不会等待。
synchronized(class)
synchronized(class)
如果不同线程监视同一个实例或者不同的实例对象,都会等待。
分享到:
相关推荐
在 Java 中,synchronized 关键字可以作用于 instance 变量、object reference(对象引用)、static 函数和 class literals(类名称字面常量)身上。 Synchronized 关键字的作用是取得对象的锁,而不是把一段代码或...
本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法加锁。 1. **方法加锁** 当在实例方法前使用`synchronized`关键字时,它会锁定当前对象的监视器,只有...
synchronized (object) { // 需要同步的代码 } ``` 这里的`object`通常是一个实例或类引用,它代表要锁定的对象。例如: ```java public class BankAccount { private double balance; public void deposit...
本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及成功与失败的场景对比。 一、`synchronized`关键字的基本概念 `synchronized`关键字可以修饰方法或用作代码块,其主要作用是...
synchronized (this) { count++; } } // 使用自定义锁 private final Object lock = new Object(); public void incrementWithCustomLock() { synchronized (lock) { count++; } } } ``` #### 性能...
volatile与synchronized的区别** `synchronized`提供了数据一致性,但会阻止线程并发执行,造成阻塞。而`volatile`关键字则可以保证变量的可见性,但不会提供互斥访问。因此,`volatile`通常用于读多写少的情况,...
除了锁住对象或类,`synchronized`还可以与`wait()`、`notify()`和`notifyAll()`方法结合使用,实现复杂的线程通信和同步。这些方法都是在`Object`类中定义的,只有在持有对象锁的情况下才能调用,否则会抛出`...
synchronized (this) { for (int i = 0; i ; i++) { System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); } } } public static void main(String[] args) { Thread1 t1 = ...
这意味着在任意时刻,都只有一个线程可以访问该实例的所有`synchronized`方法,或者进入由`synchronized(this)`标记的代码块。对于静态方法,锁对象则是该类的Class对象。 ```java public class MyClass { private...
对于静态(`static`)方法,`synchronized`关键字锁定的是类的Class对象,因此,无论有多少个类的实例,所有线程在访问静态同步方法时都需要获取类的Class对象锁。这意味着,即使有多个类实例,所有线程也无法同时执行...
synchronized (Singleton.class) { if (INSTANCE == null) { INSTANCE = new Singleton(); } } } return INSTANCE; } } ``` 5. 静态内部类:利用Java类加载机制保证线程安全,同时避免了同步带来的性能影响...
6. **synchronized与 volatile 的区别**: - `volatile`主要保证变量的可见性和有序性,但无法保证原子性,而`synchronized`则能保证原子性、可见性和有序性。 - `volatile`适用于读多写少的情况,而`synchronized...
`synchronized`关键字主要通过对象锁(object lock)机制来实现其功能。当一个线程进入`synchronized`块或方法时,它会自动获取该对象的锁;只有在退出该块或方法时,锁才会被释放。这样就能确保任何时候都只有一个...
public synchronized MyObject() { // ... } ``` - **同步类**:使用`synthetic`关键字定义一个同步类,所有其成员方法都是同步的。 ```java synchronized class SyncClass { // ... } ``` 综上,`...
它可以作用于 instance 变量、object reference(对象引用)、static 函数和 class literals(类名称字面常量)身上。 synchronized 关键字的特点 1. 无论 synchronized 关键字加在方法上还是对象上,它取得的锁都...
一、synchronized关键字的作用与原理 `synchronized`关键字主要有两个作用:同步方法和同步块。它通过锁机制来实现线程同步,防止多个线程同时执行同一段代码,可能导致的数据不一致问题。 1. 同步方法:当在方法...
其中`m4t1`使用了`synchronized(this)`,而`m4t2`没有使用`synchronized`关键字。 ```java public class Thread2 { public void m4t1() { synchronized (this) { int i = 5; while (i-- > 0) { System.out....
此外,`synchronized`还可以修饰代码块,语法形式为`synchronized(this) {...}`或`synchronized(object) {...}`。这样可以更加精确地锁定需要同步的资源,`this`代表当前对象,而`object`是任意指定的对象。这种方式...
synchronized (object) { // 需要同步的代码 } ``` 其中,`object`是监视器对象,通常是包含共享资源的类的实例。当一个线程进入同步代码块时,它会获取到监视器对象的锁,其他试图进入该同步代码块的线程必须等待...
### `synchronized`的局限与优化 虽然`synchronized`提供了线程安全,但它也有一些性能开销。锁的获取和释放都需要系统调用,这可能导致上下文切换,影响程序效率。因此,在设计高并发系统时,开发者通常会寻找更轻...