理解Java中的synchronized关键字

xiaoxiao2021-02-28  36

一、Synchronized的含义 Java多线程中的同步机制会对资源进行加锁,保证在同一时间只有一个线程可以操作对应的资源,避免多程同时访问相同资源发生冲突。synchronized关键字就是一种同步锁,可以实现同步机制,保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,并保证一个线程的变化,被其他线程所看到。 二、Synchronized的修饰对象 1.修饰普通方法:一个对象中的加锁方法只允许一个线程访问。但要注意这种情况下锁的是访问该方法的的实例对象,如果多个线程不同对象访问该方法,则无法保持同步。 2.修饰静态方法:由于静态方法是类方法,所以这种情况下锁的是包含这个方法的类,也就是类对象;这样如果多个线程不同对象访问该静态方法,也是可以同步的。 3.修饰代码块:被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象,他的同步效果和修饰普通方法一样。 4.修饰类:其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象。(同步效果和静态方法类似) synchronized方法控制范围较大,它会同步对象中所有synchronized方法的代码。synchronized代码块控制范围小,他只会同步代码块中的代码。  

三、示例  有如下两个类: class A{ public synchronized void a(){ } public synchronized void b(){ } } class A{ public static synchronized void a(){ } public static synchronized void b(){ } } 创建两个对象: A a1 = new A(); A a2 = new A();

在两个线程中并发访问:

Thread1:a1.a(); Thread2:a2.a(); 第一种情况不可以同步,因为锁的是对象;第二种可以同步,因为锁的是类。

转载请注明原文地址: https://www.6miu.com/read-2623268.html

最新回复(0)