Java同步机制详解 - 极悦
首页 课程 师资 教程 报名

Java同步机制详解

  • 2022-08-03 10:05:21
  • 427次 极悦

同步介绍

几乎所有并发模式都通过序列化对共享资源的访问来解决线程冲突。这意味着在任何给定时间只允许一个任务访问共享资源。这通常是通过在代码前面加上 lock 语句来完成的,这使得一次只有一个任务运行代码成为可能。因为锁语句会产生互斥效果,所以这种机制通常被称为互斥体。

为了防止资源冲突,Java 提供了 Synchronized 来解决互斥访问问题。任务执行同步修改后的代码时,会检查锁是否可用,获取锁,执行代码,最后释放锁。为了使用卫生间,每个人都敲门看能不能用。如果没有其他人在使用浴室,他会进入浴室并锁上门。别人来的时候,他被挡住了。

同步使用

对象锁定

同步可用于修改特定对象。例如,synObj 和 this 对象分别被锁定。即 synObj 和 this 对象分别作为共享资源用于互斥访问。thread3 和 thread4 同时访问 this(demo 对象)是互斥的。

public class Demo {
    private Object synObj = new Object();    
    public void synObj(a) {
        // Locks the synObj object
        synchronized(synObj) {
            // Synchronize the code}}public void synThis(a) {
        // Lock the current object
        synchronized(this) {
            // Synchronize the code
        }
    }
}
Demo demo = new Demo();
// Assume the following four threads are running simultaneously
new Thread(demo::synObj).start();   // thread1
new Thread(demo::synObj).start();   // thread2
new Thread(demo::synThis).start();  // thread3
new Thread(demo::synThis).start();  // thread4
Copy the code

常用方法锁

Synchronized也可以用来修改方法,其锁对象是this,所以如果一个类的多个方法中加入了synchronized,这些方法在同步执行时是互斥的。

public class Demo {
    public synchronized void test1(a) {};
    public synchronized void test2(a) {};
}
Demo demo = new Demo();
// The following two threads are mutually exclusive when executing synchronously, and both need to acquire the lock of the Demo object
new Thread(demo::test1).start();
new Thread(demo::test2).start();
Copy the code

静态方法锁

由于前两种方法中锁的粒度是对象,所以只有在同一个对象上的方法被并发调用时才会产生互斥。如果分别创建和调用两个对象Demo Demo1 = new Demo()和Demo Demo2 = new Demo(),则不产生互斥。如果要实现多个实例之间的互斥,可以通过装饰静态方法来实现。

public class StaticDemo {
    private static Object obj = new Object();
    public void test(a) {
        synchronized(obj) {
            // Synchronize the code}}public static synchronized void testStatic(a) {};
}
// Two threads are mutually exclusive
new Thread(StaticDemo::testStatic).start();
new Thread(StaticDemo::testStatic).start();
Copy the code

锁的种类

通过添加类锁,还可以实现多个实例之间的互斥。同步修改也相当于在静态方法的情况下修改当前类对象。

public class StaticDemo {
    public void test(a) {
        synchronized(StaticDemo.class) {
            // Synchronize the code}}}Copy the code

同步原理分析

synchronized无论在哪里修改,还是在修改具体的对象(实例对象或者类对象),而且synchronized的实现机制也是对对象加锁的。Java 中的每个对象都与一个监视器 ObjectMonitor 隐式关联。监控器通过CPP实现内置于JVM中,监控器地址记录在对象的MarkWord中,同步通过ObjectMonitor实现对对象的加锁操作。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交