synchronized 修饰在 static方法和非static方法的区别

简介: Java中synchronized用在静态方法和非静态方法上面的区别在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到底有什么不同呢?大家都知道,static的方法属于类方法,它属于这个

Java中synchronized用在静态方法和非静态方法上面的区别

在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到底有什么不同呢?大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,是属于类的锁。而非static方法获取到的锁,是属于当前对象的锁。所以,他们之间不会产生互斥。

上代码

package TestSynchronizedStaticOrNot;

public class TestSynchronizedStaticOrNot {

    public static synchronized void staticFunction(String name)
            throws InterruptedException {
        for (int i = 0; i < 3; i++) {
            Thread.sleep(1000);
            System.out.println(name + " --- static function running ...");
        }
    }

    public synchronized void function(String name) throws InterruptedException {
        for (int i = 0; i < 3; i++) {
            Thread.sleep(1000);
            System.out.println(name + " +++ function running ...");
        }
    }

    public static void main(String[] args) {

        final TestSynchronizedStaticOrNot demo = new TestSynchronizedStaticOrNot();

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    staticFunction("1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread11 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    staticFunction("2");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.function("1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread23 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.function("12");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread22 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    new TestSynchronizedStaticOrNot().function("2");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        thread11.start();
        thread1.start();
        thread2.start();
        thread23.start();
        thread22.start();
    }
}

这里写图片描述

根据结果很容分析到,加在类上面的锁,加载对象上面的锁。如果上了对象锁,同一个对象是不能再获取锁的,必须等待释放,如果是不同的实例还是可以去获取锁的。

那当我们想让所有这个类下面的方法都同步的时候,也就是让所有这个类下面的静态方法和非静态方法共用同一把锁的时候,我们如何办呢?此时我们可以使用Lock。

目录
相关文章
|
存储 Cloud Native 编译器
C++ static与类
C++ static与类
|
存储 Cloud Native Linux
C++ 关键字override,final的作用
C++ 关键字override,final的作用
|
3天前
|
Java
被final修饰的类的所有方法都不能被重写吗
在Java中,被`final`修饰的类不能被继承,因此其所有方法也不能被重写。`final`关键字确保了类的定义和行为不会被子类改变。
|
6月前
final关键字与static对比
final关键字与static对比
|
Java
深入理解static的作用以及被static修饰的变量、方法、块
static关键字有以下三种使用方法: 1.被static修饰的变量属于静态变量,类变量,可以通过类名,变量名直接引用,不需要进行new一个新类。 2.被static修饰的方法属于静态方法,类方法,可以通过类名,方法名直接引用,而不需要new出来一个对象 3.静态块,用于初始化一个类的时候进行一些操作,静态变量、静态方法和静态代码块都只执行一次,而且只在初始化的时候执行。
289 1
synchronized(this)、synchronized(class)和synchronized(Object)的区别
synchronized(this)、synchronized(class)和synchronized(Object)的区别
121 0
synchronized(this)、synchronized(class)和synchronized(Object)的区别
|
Java
一文带你了解Java中的static 静态关键字和final 不可变关键字
本文比较偏向基础,适合初学者观看学习参考。本文主要介绍了static 静态关键字、静态static关键字修饰成员变量、静态static关键字修饰成员方法、静态代码块、 final 关键字、final关键字用于修饰类、final关键字用于修饰成员方法 、final关键字用于修饰局部变量、final关键字用于修饰成员变量。
144 0
一文带你了解Java中的static 静态关键字和final 不可变关键字
|
Java 编译器 Spring
尽量指定方法的final修饰符
尽量指定方法的final修饰符
87 0
|
存储 Oracle 安全
你知道Java中final和static修饰的变量是在什么时候赋值的吗?
你知道Java中final和static修饰的变量是在什么时候赋值的吗?
508 0
Java常用关键字:this、super、final、static、访问修饰符
我从工作开始之前开始写博客,写到现在发现以前写的内容在现在看来有了更多想法,因此有了现在的知识重写计划,最主要的目的是维护github上的知识体系,让JavaStarter更加成熟。