深入学习Java `synchronized` 关键字

news2024/11/30 6:51:01

深入学习Java synchronized 关键字

synchronized关键字通过确保在同一时间只有一个线程可以执行某个代码块,从而防止多个线程同时访问共享资源时发生数据不一致的问题。

修饰方法

synchronized用于修饰实例方法时,表示当前实例对象是同步锁。这意味着同一个实例的其他synchronized方法在同一时间只能被一个线程访问。

当多个线程访问同一个实例对象的synchronized方法时,只有一个线程可以执行该方法,其余线程必须等待。

public class SynchronizedExample {
    public synchronized void syncMethod() {
        System.out.println("Thread " + Thread.currentThread().getName() + " is executing.");
        try {
            Thread.sleep(1000); // 模拟操作耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread " + Thread.currentThread().getName() + " finished.");
    }
}

修饰静态方法

synchronized用于修饰静态方法时,表示当前类对象是同步锁。这意味着同一个类的其他synchronized静态方法在同一时间只能被一个线程访问。

静态方法同步是针对类对象的同步,即使是不同实例调用,也会同步。

public class SynchronizedStaticExample {
    public static synchronized void syncStaticMethod() {
        System.out.println("Thread " + Thread.currentThread().getName() + " is executing static method.");
        try {
            Thread.sleep(1000); // 模拟操作耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread " + Thread.currentThread().getName() + " finished static method.");
    }
}

修饰代码块

synchronized代码块可以指定任意对象作为同步锁。它提供了更细粒度的控制,可以仅对需要同步的代码进行同步,而不是整个方法。

代码块同步提供了更灵活的控制,可以对特定对象进行同步。

public class SynchronizedBlockExample {
    private final Object lock = new Object();

    public void syncBlock() {
        synchronized (lock) {
            System.out.println("Thread " + Thread.currentThread().getName() + " is executing block.");
            try {
                Thread.sleep(1000); // 模拟操作耗时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread " + Thread.currentThread().getName() + " finished block.");
        }
    }
}

注意事项

  1. 避免过度同步:过度使用synchronized会导致线程竞争加剧,从而降低程序性能。应尽量减少同步代码的范围,仅对必要的部分进行同步。

  2. 死锁:不当的同步使用会导致死锁现象,例如两个线程互相等待对方释放锁。避免死锁的方法包括按顺序获取锁、使用超时机制等。

  3. 可见性问题:尽管synchronized可以确保代码块内的操作是原子的,但并不能解决所有的可见性问题。在某些情况下,可能需要使用volatile关键字或java.util.concurrent包中的其他同步机制来确保变量的可见性。

参考链接

  • Java Synchronized: https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1824741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ 11 新特性】lambda 表达式详解

文章目录 1. 常见 lambda 面试题🖊 1. 常见 lambda 面试题🖊 🍎① 如果⼀个 lambda 表达式作为参数传递给⼀个函数,那这个函数可以使⽤这个 lambda 表达式捕获的变量吗 ? 🐧 函数本身无法直接访问到 lambda表达式捕获…

护眼台灯哪个品牌更好?五款市面主流的护眼台灯款式分享

近年来,护眼台灯的研发和创新不断推进,一些台灯配备了智能化功能,如定时开关机、自动调节光线等,使孩子们能够更好地控制用眼时间和光线环境。护眼台灯哪个品牌更好?一些高端的护眼台灯还采用了纳米光滤镜技术&#xf…

LeetCode | 35.搜索插入位置

这套题可以直接遍历,找到第一个大于target的数并返回其位置即可,但是时间复杂度为 O ( n 2 ) O(n^2) O(n2),题目中明确要求时间复杂度为 O ( l o g n ) O(logn) O(logn),考虑二分查找算法,这道题就是标准的二分查找的一…

Studio One软件最新版下载及详细安装教程

Studio One 6是一款功能丰富、专业级的音乐制作软件,它具备灵活的工作流程和高效的团队协作能力,能帮助用户实现高质量的音乐创作和制作。 智能模板更快的启动,全新的智能模板为你手头的任务提供了必要的工具集,包括基本录制、混音…

RFID技术助力资产信息数字化转型

在当前快速发展的信息化时代,资产信息的数字化转型对企业管理和运营具有重要意义。RFID技术作为一种先进的物联网技术,通过将资产信息全面数字化,实现高效、准确的管理和追踪,极大地提升了企业的运营效率和管理水平。 首先&#x…

Java版+ SaaS应用+接口技术RESTful API 技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开

Java版 SaaS应用接口技术RESTful API WebSocket WebService技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开 医院住院管理系统(Hospital Information System简称HIS)是一门医学、信息、管理、计算机等多种学科为一体的边缘科学&#xff…

进来学习Kubernetes知识点

Kubernetes集群部署 文章目录 Kubernetes集群部署一、Kubernetes概述1.1、什么是Kubernetes1.2、为什么要用Kubernetes 二、Kubernetes组件2.1、Master组件2.2、Node组件 三、Kubernetes资源对象3.1、Pod3.2、Label3.3、Replication Controller3.4、Deployment3.5、Service3.6、…

Mac M3 Pro 安装 Zookeeper-3.4.6

1、下载安装包 官方下载地址:https://archive.apache.org/dist/zookeeper/ 网盘下载地址:https://pan.baidu.com/s/1j6iy5bZkrY-GKGItenRB2w?pwdirrx 提取码: irrx 2、解压并添加环境变量 # 将安装包移动到目标目录 mv ~/Download/zookeeper-3.4.6.…

Django配置连接池:使用django-db-connection-pool配置连接池

一、该三方库文档使用 github地址: https://github.com/altairbow/django-db-connection-pool/blob/1.2.5/README_CN.mdhttps://github.com/altairbow/django-db-connection-pool/blob/1.2.5/README_CN.md1、选择指定版本,查看指定版本的文档和配置&am…

层出不穷的大模型产品:使用体验、倾向选择及未来展望

✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点赞、关注、收藏、评论,是对我最大…

Makefile-快速掌握

引用 本文完全参照大佬的文档写的,写这篇文章只是为了梳理一下知识 https://github.com/marmotedu/geekbang-go/blob/master/makefile/Makefile%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md 介绍 Makefile是一个工程文件的编译规则,描述了整个工程的编译…

Vue I18n国际化插件

Vue I18n国际化插件 安装目录结构及文件内容./locales/lang/zh.js./locales/lang/en.js./locales/index.js main.js引入页面具体使用及语言切换(Vue3)刷新保存原语言,App.vue添加路由守卫注意点 中文文档: https://kazupon.githu…

源代码防泄密的方法有哪些?

在当今发展潮流中,网络信息安全隐患变得越来越突出,信息泄漏事件时有发生。我们都知道,电子文件非常容易复制,可以通过各种途径如邮件、光盘、U盘、网络存储等进行传播。企事业单位的机密文件、研发源代码、图纸等核心技术机密资料…

vxe-table表格新增节点

做前端的朋友可以参考下&#xff1a;也可结合实际需求查看相应的官方文档 效果图 附上完整代码 <template><div><vxe-toolbar ref"toolbarRef" :refresh"{queryMethod: searchMethod}" export print custom><template #buttons>&…

「计算机网络」初识http协议

前言 HTTP协议——互联网发展的基石&#xff0c;从一个最简单的“helloworld”网页&#xff0c;到现在博客平台、视频网站都离不开HTTP协议的存在。随着互联网的发展&#xff0c;Web网页的设计也越发复杂&#xff0c;前后端开发的分工也越发明确&#xff0c;HTTP作为连接前后端…

扣子arixv论文检索工作流开源(Sam老师作品)

因为在扣子上找不到好用的AI论文检索Bot&#xff0c;之前借助工作流和arxiv.org API开发了一个工具&#xff0c;当时写了一篇介绍。 核心流程比较简单&#xff0c;但有很多同学咨询了解&#xff0c;今天抽了点时间把工作流完全开源了。为了方便对比&#xff0c;在公共Team中通过…

pytest + yaml 框架 - 65.Pycharm 设置 yaml 格式用例模板,高效写用例

前言 初学者对yaml 格式不太熟悉,自己写yaml用例的时候,总是格式对不齐,或者有些关键字会忘记。 于是我们可以在pycharm上设置用例模块,通过快捷方式调用出对应的模块,达到高效写用例的目的。 pycharm设置用例模板 File - Settings Live Templates - python 点 + 号…

RabbitMQ实践——交换器(Exchange)绑定交换器

在《RabbitMQ实践——交换器&#xff08;Exchange&#xff09;和绑定&#xff08;Banding&#xff09;》一文中&#xff0c;我们实验了各种交换器。我们可以把交换器看成消息发布的入口&#xff0c;而消息路由规则则是由“绑定关系”&#xff08;Banding&#xff09;来定义&…

中国姓名学十大权威专家颜廷利:全国排名第一的起名大师

颜廷利教授,是济南市历城区唐王镇的名人,位居2023年中国当代十大国学大师排行榜之首。全国排名第一的起名大师颜廷利教授以其深厚的学术造诣和卓越的贡献赢得了名誉和尊重,成为当代国学界的翘楚。他从事国学研究已有数十年,对经史子集的研究融会贯通,展现出了非凡的学术造诣。中…

springboot宠物医院信息管理系统-计算机毕业设计源码04164

摘 要 现如今在中国&#xff0c;随着人民生活质量的逐渐提高&#xff0c;以及人民群众消费能力的日渐增长&#xff0c;各种各样的家养小动物&#xff0c;已经逐渐成为人类越来越亲密的生活伴侣。并且&#xff0c;现如今社会竞争及其激烈&#xff0c;人们的生活节奏越发急促、紧…