【问题描述】关于Java中synchronized 用在实例方法和对象方法上面的区别
【问题分析】大家都知道,在Java中,synchronized 是用来表示同步的,我们可以synchronized 来修饰一个方法(实例方法和类方法---注:不知道这样叫准确不准确,大家理解我的意识就行了)。也可以synchronized 来修饰方法里面的一个语句块。
修饰实例方法:
修饰类方法(static 方法):
修饰方法里面语句块:
注意:这里不能用synchronized修饰方法外面的语句块(我把他叫做类语句块),虽然我们可以在方法外面定义语句块,这样做会遇到编译错误,这里涉及到了Java里面的对象初始化的部分知识。大概的原因就是synchronized锁住的是对象,当初始化对象的时候,JVM在对象初始化完成之前会调用方法外面的语句块,这个时候对象还不存在,所以就不存在锁了。
那么,在static方法和非static方法前面加synchronized到底有什么不同呢?
大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,就是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。而非static方法获取到的锁,就是当前调用这个方法的对象的锁了。所以,他们之间不会产生互斥。
看代码:
运行结果是:
那当我们想让所有这个类下面的对象都同步的时候,也就是让所有这个类下面的对象共用同一把锁的时候,我们如何办呢?
看代码:
运行结果:
分享到:
相关推荐
Java 语言中的修饰词可以用来控制成员的访问权限、确保类和方法的不可变性、定义抽象类和抽象方法、调用 native 库、确保浮点计算的精度和可移植性、确保多线程环境中的安全执行等等。正确地使用修饰词可以提高 Java...
在 Java 中,synchronized 关键字可以作用于 instance 变量、object reference(对象引用)、static 函数和 class literals(类名称字面常量)身上。 Synchronized 关键字的作用是取得对象的锁,而不是把一段代码或...
当一个非静态方法被synchronized修饰时,该方法被称为同步方法。同步方法通过对象锁进行保护,同一时刻,只有一个线程能够访问该对象的同步方法。例如: ```java public class Test { public synchronized void ...
Java 访问修饰符是 Java 编程语言中的一种重要机制,它控制着类、方法和变量的访问权限。访问修饰符可以分为四种:public、protected、private 和缺省(无访问修饰符)。 public 访问修饰符 public 访问修饰符是最...
Java 中 Synchronized(对象锁)和 Static Synchronized(类锁)的区别 Synchronized 和 Static Synchronized 是 Java 中两种同步机制,它们都用于解决多线程并发访问的安全问题。然而,它们之间存在着本质的区别。...
Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够正确地按照预定顺序进行,防止数据不一致性和线程安全问题。本篇将深入探讨`synchronized`修饰...
Java作为一门广泛使用的编程语言,拥有丰富的语法结构和关键字,其中修饰词(modifiers)是Java语言中的重要组成部分,用于限定类、方法、字段等的访问级别、生命周期以及特性。以下是对Java中11个修饰词的详细介绍...
1. 无论 synchronized 关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁。 2. 每个对象只有一个锁(lock)与之相关联。 3. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁...
在Java中,某些修饰符可以组合使用,如`public static`、`protected final`等,以达到更精细的控制效果。例如,`public static`方法表示该方法是公共的且与类实例无关,而`protected final`变量则表示受保护的且不可...
JAVA 访问修饰符是 JAVA 语言中的一种基本概念,它控制着类、方法、变量的访问权限,帮助开发者更好地组织和管理代码。根据 JAVA 访问修饰符的特性和使用范围,我们可以将其分为三类:修饰符类的访问修饰符、属性的...
synchronized 静态方法修饰一个 static 静态方法,其作用范围是整个静态方法,作用对象是这个类的全部对象。synchronized 类,其作用范围是 Synchronized 后面括号括起来的部分 synchronized(className.class),作用...
在Java编程语言中,修饰符是用来限制或指定代码元素(如类、方法、变量)的访问权限、特性或行为的关键词。以下是对标题和描述中提及的Java修饰符及其相关知识点的详细介绍: 1. 类的访问控制修饰符: - **public*...
本文将深入解析`synchronized`在Java中的应用和工作原理。 一、`synchronized`的基本用法 `synchronized`可以应用于方法或代码块。当它修饰一个方法时,整个方法被视为同步的,只有一个线程可以执行该方法。当修饰...
在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要机制,它确保了在多线程环境下,对共享资源的访问是安全的。本文将深入探讨`synchronized`关键字在同步静态方法和非静态方法上的异同。 首先,`...
- **同步方法**:在方法声明前加上`synchronized`关键字,使得整个方法成为同步方法。 ```java public synchronized void method() { // ... } ``` - **同步代码块**:指定一个对象作为锁,对特定的代码块...
Java编程语言的构造方法是Java中特殊的方法,它可以确保用户正确地构造对象,对对象做初始化工作。构造方法的主要特点是方法名与类名相同,无返回值,通常是公有的,带有参数,主要工作是完成对象的部分或全部成员...
本文将详细介绍Java中常见的修饰符及其用途。 1. **类的修饰符** - **public**: 公共访问控制符,允许任何地方的任何类访问。Java程序的主类必须是public,以便作为程序的入口点。 - **abstract**: 抽象类修饰符...
同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该方法。例如: ```java public class Counter { private int count = 0; public synchronized void increment...
在Java语言中,如果需要定义一个类域或类方法,应使用static修饰符。 知识点15:Applet程序 在Java语言中,在浏览器中执行Applet程序,init()方法将被最先执行。 知识点16:内存回收 在Java语言中,内存回收程序...