首页 > 其他分享 >synchronized 关键字

synchronized 关键字

时间:2024-08-11 16:05:13浏览次数:10  
标签:Java synchronized 对象 关键字 线程 修饰

1 synchronized 关键字的作用

  1. 互斥访问:
    当一个线程获得了由 synchronized 修饰的方法或代码块的锁后,其他线程必须等待该锁被释放才能继续执行。
    这种机制保证了同一时间只有一个线程可以执行被 synchronized 修饰的代码段。
  2. 可见性:
    synchronized 关键字确保了当一个线程修改了共享变量后,这些修改对其他线程是可见的。
    当一个线程释放锁时,它会强制刷新线程的工作内存到主内存,其他线程在获取锁时会从主内存中读取最新的变量值。
  3. 有序性:
    synchronized 关键字保证了在 synchronized 代码块中的操作按照它们出现的顺序执行,防止了指令重排序。

2 synchronized 的使用

2.1 修饰方法

public synchronized void method() {
    // ...
}

  • 当一个方法被 synchronized 修饰时,它会在该方法的入口处获取锁,在方法结束或抛出异常时释放锁。
  • 锁的对象是当前对象的实例(如果是实例方法)或类对象(如果是静态方法)。

2.2 修饰代码块

public void method() {
    synchronized (lockObject) {
        // ...
    }
}
  • 当一个代码块被 synchronized 修饰时,它会获取指定对象的锁。
  • 锁的对象可以是任何对象,通常使用一个私有静态的锁对象来确保线程安全。

3 底层实现原理

synchronized 关键字的底层实现涉及到 Java 对象的监视器锁(Monitor)。每个 Java 对象都可以成为一个监视器锁,当一个线程获取了某个对象的锁后,其他线程必须等待该锁被释放才能继续执行。监视器锁的信息存储在 Java 对象头中。

标签:Java,synchronized,对象,关键字,线程,修饰
From: https://www.cnblogs.com/sherioc/p/18353523

相关文章

  • C#多线程并发编程深度探索:解锁async、await、Task与lock等关键字的奥秘
    一、多线程介绍1.什么是多线程多线程是指在一个应用程序中同时执行多个线程的能力。每个线程都是独立运行的,拥有自己的执行路径和资源。多线程编程能够充分利用多核处理器的计算能力,提高应用程序的性能和响应性,特别是在处理耗时任务和并行计算时效果显著。在C#中,线程是程序......
  • Java进阶篇之super关键字
    引言在前面的文章中,我们介绍了继承的相关概念(Java进阶篇之继承的概念),在Java继承机制中,super关键字是一个重要的工具,用于访问父类的属性和方法,特别是在子类覆盖了父类的成员时。通过使用super,子类可以调用父类的构造方法,访问父类的成员变量和方法,这在继承层次中至关重要。本......
  • 关键字和保留字
    Java基础语法中包含了多个关键字(Keywords)和保留字(ReservedWords)。这些关键字和保留字在Java语言中具有特殊的意义,用于表示数据类型、程序结构、控制流程等。关键字(Keywords)Java中目前一共有50个关键字(也有说法认为是53个,这取决于是否将true、false、null视为特殊直接量),这些关键......
  • synchronized
    synchronized关键字来保证线程安全的,被sychronized锁住的代码部分,同一时刻只能有一个线程可以访问,其他线程会block(同一个对象内,不同对象间不会影响)。由于synchronized的机制是在同一时刻只能有一个线程操作,其他的线程阻塞或者轮询等待,在线程竞争激烈的情况下,这种方式的效率会非常......
  • C语言进阶——一文带你深度了解“C语言关键字”(中篇3)
    这篇文章记录我学习C语言关键字的相关知识,旨在记录一些进阶的知识。目录一、if、else之间的组合(一)、bool变量与零值之间的比较(二)、float变量与零值之间的比较 (三)、指针变量与零值之间的比较 (四)、else究竟与哪个if进行配对呢?二、结语 一、if、else之间的组合(一......
  • static关键字
    static关键字static关键字在Java中用于表示某个成员(方法、变量、常量或代码块)属于类本身,而不是类的某个特定实例。以下是static关键字的一些主要用法和特性:静态变量:使用static声明的变量是静态变量,也称为类变量。它们在类加载时创建,并在程序运行期间一直存在,直到程序结束。pu......
  • this关键字
    this关键字this关键字是一个非常重要的概念,它指的是当前对象的引用。使用this关键字可以访问当前对象的属性和方法。引用当前对象的属性:当类的实例变量和局部变量或参数同名时,可以使用this关键字来区分它们。publicclassExample{privateintvalue;publicExam......
  • super关键字
    super关键字super关键字是一个引用,它指向当前对象的直接父类。使用super关键字可以访问父类中定义的成员,包括属性、方法和构造函数。访问父类的属性:如果子类重写了父类的方法,并且需要在子类方法中使用父类的方法实现,可以使用super来引用父类的方法。调用父类的方法:当子类......
  • final关键字
    final关键字final关键字是一个修饰符,它可以用来修饰类、方法和变量。final类:当一个类被声明为final时,它不能被其他类继承。这意味着这个类是封闭的,不能有任何子类。publicfinalclassUtilityClass{//类成员}final方法:将方法声明为final可以防止子类重写......
  • 项目中使用`import`关键字导入文件方式
    一.默认导出一个模块可能只有一个主要的导出内容时,你可以使用默认导出来简化导入过程。a文件导出constfun=()=>{} exportdefaultfun; b文件导入importfunfrom"@/xx/b.js";fun() //方法调用返回abc二.具名导出一个模块包含多个导出内容时,你可......