美文网首页
synchronized 对象锁和类锁的区别

synchronized 对象锁和类锁的区别

作者: Bfmall | 来源:发表于2023-08-17 07:09 被阅读0次

synchronized 描述

一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限, 在Java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码); 线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中等待的某个线程就可以拿到锁执行同步代码了。 这样就保证了同步代码在统一时刻只有一个线程在执行。

多线程的线程同步机制实际上是靠锁的概念来控制的。

对象锁

加锁非静态方法,即是对象锁。synchronized修饰非静态方法、同步代码块的synchronized (this)用法和synchronized (非this对象)的用法锁的是对象,线程想要执行对应同步代码,需要获得对象锁。

看一个例子

定义一个SysTask,加锁一个非静态方法doSomeThing()

package thread.demo;

public class SysTask {
    public synchronized void doSomeThing(){
        System.out.println("start thread name is :" + Thread.currentThread().getName());
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end thread name is :" + Thread.currentThread().getName());
    }
}

再创建一个测试类Test

package thread.demo;

public class Test {
    public static void main(String[] args) {
        SysTask sysTask = new SysTask();
        for (int i=0 ;i<3;i++){
          Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    sysTask.doSomeThing();
                }
            });
            thread.setName(i+"-name");
            thread.start();
        }
    }
}

结果:

start thread name is :0-name
end thread name is :0-name
start thread name is :2-name
end thread name is :2-name
start thread name is :1-name
end thread name is :1-name

很明显此处是同步的。因为此处循环里面的是同一个对象,而对象锁是锁住的对象,所以是同步的。

下面修改一下测试类:

public class Test {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            SysTask sysTask = new SysTask();
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    sysTask.doSomeThing();
                }
            });
            thread.setName(i + "-name");
            thread.start();
        }

    }
}

此时结果是:

start thread name is :0-name
start thread name is :1-name
start thread name is :2-name
end thread name is :0-name
end thread name is :1-name
end thread name is :2-name

此时是异步的,因为每次调用同步方法的时候都是实例化不同的对象。

类锁

加锁静态方法,即类锁。可以换个方向理解,静态方法其实就是类方法,所以加锁静态方法,即类锁。类锁的范围是整个实体类,即全局锁。

继续看例子:

package thread.demo;

public class SysTaskStatic {
    public synchronized static void doSomeThing(){
        System.out.println("start thread name is :" + Thread.currentThread().getName());
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end thread name is :" + Thread.currentThread().getName());
    }
}

测试类:

package thread.demo;

public class TestSatic {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    SysTaskStatic.doSomeThing();
                }
            });
            thread.setName(i + "-name");
            thread.start();
        }

    }
}

结果是:

start thread name is :0-name
end thread name is :0-name
start thread name is :1-name
end thread name is :1-name
start thread name is :2-name
end thread name is :2-name

结果很明显,是同步的,可以看出来类锁是达到了全局的效果。

转自:https://www.modb.pro/db/121830

相关文章

  • 高并发篇

    高并发篇 java锁有那些 synchronized和lock的区别 synchronized的类锁和对象锁的区别...

  • 方法锁、对象锁和类锁区别

    方法锁、对象锁和类锁区别 引言:结合synchronized进行分析。 synchronized用来处理多个线程同...

  • Lock锁

    synchronized 锁和 Lock 锁的区别 Lock 锁,Java类,synchronized,关键字。s...

  • Java中synchronized原理

    前言 synchronized可以修饰方法和代码块。synchronized需要持有一个对象锁。分为类锁和对象锁。...

  • Synchronized对象锁和类锁区别

    java的内置锁 每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自...

  • Synchronized 作用域

    如图,synchronized可以用在方法和代码块中,被锁对象的区别: 1. 如果锁的是类对象的话,尽管new多个...

  • 并发

    锁:方法锁、对象锁、类锁1.方法锁(synchronized修饰方法时):synchronized放在方法和在方法...

  • MySQL的锁怎么解?

    大家都知道java里面的synchronized,对象锁。(这里不扯什么类锁,对象锁,类锁其实就是Class对象的...

  • synchronized :同步锁

    synchronized 同步锁分为对象锁、类锁、静态方法锁、非静态方法锁等。其中对象锁和非静态方法锁的作用域是对...

  • 2019-08-08 面试基础之并发编程

    一.synchronized关键字 1.线程安全问题 2.synchronized获取的锁分类:对象锁和类锁 二....

网友评论

      本文标题:synchronized 对象锁和类锁的区别

      本文链接:https://www.haomeiwen.com/subject/teehmdtx.html