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。

目录
相关文章
|
6月前
final修饰的变量有三种
final修饰的变量有三种
70 0
|
存储 Cloud Native 编译器
C++ static与类
C++ static与类
|
存储 Cloud Native Linux
C++ 关键字override,final的作用
C++ 关键字override,final的作用
|
6月前
final关键字与static对比
final关键字与static对比
|
Java
深入理解static的作用以及被static修饰的变量、方法、块
static关键字有以下三种使用方法: 1.被static修饰的变量属于静态变量,类变量,可以通过类名,变量名直接引用,不需要进行new一个新类。 2.被static修饰的方法属于静态方法,类方法,可以通过类名,方法名直接引用,而不需要new出来一个对象 3.静态块,用于初始化一个类的时候进行一些操作,静态变量、静态方法和静态代码块都只执行一次,而且只在初始化的时候执行。
289 1
|
设计模式 存储 Java
static和final关键字 学习 demo练习
static和final关键字 学习 demo练习
65 2
|
Java 编译器 Spring
尽量指定方法的final修饰符
尽量指定方法的final修饰符
86 0
|
存储 Oracle 安全
你知道Java中final和static修饰的变量是在什么时候赋值的吗?
你知道Java中final和static修饰的变量是在什么时候赋值的吗?
505 0
|
安全 Java 数据安全/隐私保护
面试官:private修饰的方法可以通过反射访问,那么private的意义是什么?
面试官:private修饰的方法可以通过反射访问,那么private的意义是什么?
Java常用关键字:this、super、final、static、访问修饰符
我从工作开始之前开始写博客,写到现在发现以前写的内容在现在看来有了更多想法,因此有了现在的知识重写计划,最主要的目的是维护github上的知识体系,让JavaStarter更加成熟。