首页 > 其他分享 >synchronized关键字的使用和原理

synchronized关键字的使用和原理

时间:2024-10-08 20:20:39浏览次数:10  
标签:synchronized 代码 counter 关键字 线程 原理 方法 public

在 Java 中,synchronized关键字是一种用于实现线程同步的机制,它可以确保在同一时刻只有一个线程能够访问被synchronized修饰的代码块或方法。

一、作用和原理

  1. 互斥访问:

    • synchronized关键字通过对共享资源加锁来实现互斥访问。当一个线程进入synchronized代码块或方法时,它会获取相应的锁,其他线程如果也想进入相同的synchronized代码块或方法,就必须等待直到锁被释放。
    • 这样可以防止多个线程同时访问共享资源,从而避免数据不一致和竞争条件等问题。
  2. 锁的类型:

    • 在 Java 中,每个对象都有一个内置的锁(也称为监视器锁)。当一个线程进入synchronized代码块或方法时,它实际上是获取了对象的内置锁。
    • 对于synchronized方法,锁是当前对象实例(对于静态synchronized方法,锁是类的Class对象)。对于synchronized代码块,可以指定一个对象作为锁。

二、使用方法

  • synchronized方法:

可以将一个方法声明为synchronized,这样在同一时刻只有一个线程能够执行这个方法。

示例:

     public class SynchronizedMethodExample {
         private int counter = 0;

         public synchronized void increment() {
             counter++;
         }

         public synchronized int getCounter() {
             return counter;
         }
     }

  • synchronized代码块:

可以在代码块上使用synchronized关键字,并指定一个对象作为锁。

示例:

     public class SynchronizedBlockExample {
         private Object lock = new Object();
         private int counter = 0;

         public void increment() {
             synchronized (lock) {
                 counter++;
             }
         }

         public int getCounter() {
             synchronized (lock) {
                 return counter;
             }
         }
     }

三、可重入性

1.概念

synchronized具有可重入性,这意味着一个线程可以多次获取同一个对象的锁。例如,如果一个synchronized方法调用了另一个synchronized方法,而这两个方法都在同一个对象上,那么同一个线程可以无需等待地进入第二个方法,因为它已经持有了对象的锁。

示例:

   public class ReentrantSynchronizedExample {
       public synchronized void method1() {
           System.out.println("Inside method1.");
           method2();
       }

       public synchronized void method2() {
           System.out.println("Inside method2.");
       }
   }

四、注意事项和局限性

性能开销:

使用synchronized会带来一定的性能开销,因为线程获取和释放锁需要进行一些系统调用和上下文切换。在高并发场景下,如果锁的竞争非常激烈,可能会导致性能下降。

死锁风险:

如果多个线程以不正确的顺序获取多个锁,可能会导致死锁。例如,线程 A 持有锁 1 并等待锁 2,而线程 B 持有锁 2 并等待锁 1,这样两个线程就会相互等待,导致死锁。

粒度问题:

如果synchronized代码块或方法的粒度太大,可能会导致不必要的线程阻塞,降低并发性能。相反,如果粒度太小,可能会增加锁的获取和释放次数,也会影响性能。

总之,synchronized关键字是 Java 中实现线程同步的一种重要机制,但在使用时需要注意性能开销、死锁风险和粒度问题等。在高并发场景下,可以考虑使用其他更高级的同步机制,如ReentrantLockSemaphore等,它们提供了更多的功能和灵活性。

标签:synchronized,代码,counter,关键字,线程,原理,方法,public
From: https://blog.csdn.net/challenge51all/article/details/142742039

相关文章

  • Spark的前瞻--- 数据处理方式,HDFS读写流程,MR计算原理,YRAN资源调度原理,分布式计算
    目录一,数据处理的方式1,单机数据处理2,集群数据储存1,HDFS的读写流程 4,分布式资源调度YRAN1,YRAN原理图二,分布式计算框架1,MapReduce分布式计算2,Spark分布式计算spark的部署方式1,spark资源调度yran模式三,Spark的开发方式1,交互式开发2,脚本式开发......
  • 51单片机的自动烘手器【proteus仿真+程序+报告+原理图+演示视频】
    1、主要功能 该系统由AT89C51/STC89C52单片机+LCD1602显示模块+温度传感器+红外传感器+时钟模块+继电器+LED和按键等模块构成。适用于智能干手器、智能烘干器、自动感应烘干器等相似项目。可实现功能:1、LCD1602实时显示当前日期、时间和环境温度2、温度传感器DS18B20采......
  • Ribbon负载均衡原理、负载均衡策略以及懒加载
    目录负载均衡流程问题分析执行流程底层源码分析进入LoadBalancerInterceptor进入ClientHttpRequestInterceptor重新回到LoadBalancerInterceptor负载均衡策略通过定义IRule实现可以修改负载均衡规则代码方式配置文件方式饥饿加载总结负载均衡流程问题分析or......
  • 了解final关键字在Java并发编程领域的作用吗?
    在Java并发编程领域,final关键字扮演着一个至关重要的角色。虽然很多同学熟悉final用于修饰变量、方法和类的基本用法,但其在并发环境中的应用和原理却常常被忽视。final关键字不仅仅是一个简单的修饰符,它在多线程编程中确保对象状态的可见性和不变性,这对于构建线程安全的应用至关重......
  • StarRocks基本架构原理
    概念StarRocks是新一代高性能分析型数据仓库,支持实时、多维、高并发的数据分析;StarRocks支持从各种数据源进行实时和批量数据推流,它还允许您直接分析存储在数据湖中的数据,无需数据迁移StarRocks非常适合对新数据进行实时分析。可以高速摄取数据,并实时更新和删除数据场景St......
  • GUI图形界面 无代码开发 原理 - 属性标识链 | uiotos致敬amis、nodered、appsmith、co
    低代码饱受争议。也有例外:后端NodeRed,前端Amis。整体还是诟病为主:简单业务可以,复杂的是扯淡,不论前后端。这是一贯的认知。在GUI方面,UIOTOS发明的嵌套技术,为复杂前端的无代码开发,开辟了一条新的思路。往期文章:可视化拖拉拽?过时了!组态零代码,不能做复杂前端?嵌套原理一复杂交互......
  • 深入理解 synchronized 的锁升级【转载】
    目录本文转载自:前言锁升级无锁偏向锁轻量级锁重量级锁总要有总结锁优化本文转载自:深入理解synchronized的锁升级-掘金(juejin.cn)前言        最近看到一道有关synchronized关键字的面试题:不同JDK版本对synchronized有何优化?这道面试题的目......
  • 计算机组成原理核心考点
    参次结构机器级包括汇编语言及机器语言通过编译器将预处理文件转化为汇编语言时,就是将高级语言转化为机器级目标代码文件的过程,分水岭是编译程序编码大小补码:FFFx=FFFF-[FFFF-(16-x)]=x-16FFxy=FFFF-[FFFF-(256-x16-y)]=x16+y-256补码负数的表示法他们为了继续使用模......
  • 深度学习中的注意力机制:原理、应用与发展
    一、引言在深度学习领域,注意力机制(AttentionMechanism)已经成为一种极为重要的技术手段。它的出现使得模型能够像人类一样,在处理大量信息时聚焦于关键部分,从而提高模型的性能和效率。从自然语言处理到计算机视觉等多个领域,注意力机制都展现出了卓越的能力,极大地推动了深度......
  • 在K8S中,kube-proxy ipvs原理是什么?
    在Kubernetes(K8S)中,kube-proxy的IPVS模式是一种高性能的负载均衡解决方案,它利用Linux内核的IPVS(IPVirtualServer)功能来实现服务的负载均衡。以下是kube-proxy在IPVS模式下的工作原理:监听API服务器:kube-proxy启动后会持续监听KubernetesAPI服务器上的Service资源......