`

Java语言中synchronized 修饰在 static方法和 非static方法的区别

 
阅读更多

【问题描述】关于Java中synchronized 用在实例方法和对象方法上面的区别

【问题分析】大家都知道,在Java中,synchronized 是用来表示同步的,我们可以synchronized 来修饰一个方法(实例方法和类方法---注:不知道这样叫准确不准确,大家理解我的意识就行了)。也可以synchronized 来修饰方法里面的一个语句块。

修饰实例方法:


修饰类方法(static 方法):
修饰方法里面语句块:

注意:这里不能用synchronized修饰方法外面的语句块(我把他叫做类语句块),虽然我们可以在方法外面定义语句块,这样做会遇到编译错误,这里涉及到了Java里面的对象初始化的部分知识。大概的原因就是synchronized锁住的是对象,当初始化对象的时候,JVM在对象初始化完成之前会调用方法外面的语句块,这个时候对象还不存在,所以就不存在锁了。

那么,在static方法和非static方法前面加synchronized到底有什么不同呢?

大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,就是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。而非static方法获取到的锁,就是当前调用这个方法的对象的锁了。所以,他们之间不会产生互斥。

看代码:


运行结果是:



那当我们想让所有这个类下面的对象都同步的时候,也就是让所有这个类下面的对象共用同一把锁的时候,我们如何办呢?

看代码:


运行结果:






分享到:
评论

相关推荐

    Java编程中常用修饰词使用方法

    Java 语言中的修饰词可以用来控制成员的访问权限、确保类和方法的不可变性、定义抽象类和抽象方法、调用 native 库、确保浮点计算的精度和可移植性、确保多线程环境中的安全执行等等。正确地使用修饰词可以提高 Java...

    java中synchronized用法

    在 Java 中,synchronized 关键字可以作用于 instance 变量、object reference(对象引用)、static 函数和 class literals(类名称字面常量)身上。 Synchronized 关键字的作用是取得对象的锁,而不是把一段代码或...

    Java中synchronized关键字修饰方法同步的用法详解

    当一个非静态方法被synchronized修饰时,该方法被称为同步方法。同步方法通过对象锁进行保护,同一时刻,只有一个线程能够访问该对象的同步方法。例如: ```java public class Test { public synchronized void ...

    Java访问修饰符

    Java 访问修饰符是 Java 编程语言中的一种重要机制,它控制着类、方法和变量的访问权限。访问修饰符可以分为四种:public、protected、private 和缺省(无访问修饰符)。 public 访问修饰符 public 访问修饰符是最...

    透彻理解Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别

    Java 中 Synchronized(对象锁)和 Static Synchronized(类锁)的区别 Synchronized 和 Static Synchronized 是 Java 中两种同步机制,它们都用于解决多线程并发访问的安全问题。然而,它们之间存在着本质的区别。...

    Java多线程程序中synchronized修饰方法的使用实例

    Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够正确地按照预定顺序进行,防止数据不一致性和线程安全问题。本篇将深入探讨`synchronized`修饰...

    Java入门——Java修饰词总结

    Java作为一门广泛使用的编程语言,拥有丰富的语法结构和关键字,其中修饰词(modifiers)是Java语言中的重要组成部分,用于限定类、方法、字段等的访问级别、生命周期以及特性。以下是对Java中11个修饰词的详细介绍...

    java的线程同步机制synchronized关键字的理解_.docx

    1. 无论 synchronized 关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁。 2. 每个对象只有一个锁(lock)与之相关联。 3. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁...

    Java修饰符总结

    在Java中,某些修饰符可以组合使用,如`public static`、`protected final`等,以达到更精细的控制效果。例如,`public static`方法表示该方法是公共的且与类实例无关,而`protected final`变量则表示受保护的且不可...

    JAVA访问修饰符大归纳

    JAVA 访问修饰符是 JAVA 语言中的一种基本概念,它控制着类、方法、变量的访问权限,帮助开发者更好地组织和管理代码。根据 JAVA 访问修饰符的特性和使用范围,我们可以将其分为三类:修饰符类的访问修饰符、属性的...

    实例解析Java中的synchronized关键字与线程平安问题_.docx

    synchronized 静态方法修饰一个 static 静态方法,其作用范围是整个静态方法,作用对象是这个类的全部对象。synchronized 类,其作用范围是 Synchronized 后面括号括起来的部分 synchronized(className.class),作用...

    java修饰符介绍

    在Java编程语言中,修饰符是用来限制或指定代码元素(如类、方法、变量)的访问权限、特性或行为的关键词。以下是对标题和描述中提及的Java修饰符及其相关知识点的详细介绍: 1. 类的访问控制修饰符: - **public*...

    java-synchronized详解.doc

    本文将深入解析`synchronized`在Java中的应用和工作原理。 一、`synchronized`的基本用法 `synchronized`可以应用于方法或代码块。当它修饰一个方法时,整个方法被视为同步的,只有一个线程可以执行该方法。当修饰...

    java synchronized同步静态方法和同步非静态方法的异同

    在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要机制,它确保了在多线程环境下,对共享资源的访问是安全的。本文将深入探讨`synchronized`关键字在同步静态方法和非静态方法上的异同。 首先,`...

    详细解读java同步之synchronized解析

    - **同步方法**:在方法声明前加上`synchronized`关键字,使得整个方法成为同步方法。 ```java public synchronized void method() { // ... } ``` - **同步代码块**:指定一个对象作为锁,对特定的代码块...

    Java编程语言构造方法研究.pdf

    Java编程语言的构造方法是Java中特殊的方法,它可以确保用户正确地构造对象,对对象做初始化工作。构造方法的主要特点是方法名与类名相同,无返回值,通常是公有的,带有参数,主要工作是完成对象的部分或全部成员...

    java常用的修饰符

    本文将详细介绍Java中常见的修饰符及其用途。 1. **类的修饰符** - **public**: 公共访问控制符,允许任何地方的任何类访问。Java程序的主类必须是public,以便作为程序的入口点。 - **abstract**: 抽象类修饰符...

    synchronized用法大全实例

    同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该方法。例如: ```java public class Counter { private int count = 0; public synchronized void increment...

    JAVA语言程序设计应考必备题库.pdf

    在Java语言中,如果需要定义一个类域或类方法,应使用static修饰符。 知识点15:Applet程序 在Java语言中,在浏览器中执行Applet程序,init()方法将被最先执行。 知识点16:内存回收 在Java语言中,内存回收程序...

Global site tag (gtag.js) - Google Analytics