彻底理解synchronized,很棒的博文

2023-11-11 12:50

本文主要是介绍彻底理解synchronized,很棒的博文,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:https://www.javazhiyin.com/869.html

Loading
0

彻底理解synchronized

        </header><div class="entry"><div class="entry-inner"><h1>1. synchronized简介</h1>

在学习知识前,我们先来看一个现象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SynchronizedDemo implements Runnable {private static int count = 0;public static void main(String[] args) {for (int i = 0; i < 10; i++) {Thread thread = new Thread(new SynchronizedDemo());thread.start();}try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("result: " + count);}@Overridepublic void run() {for (int i = 0; i < 1000000; i++)count++;}
}

public class SynchronizedDemo implements Runnable { private static int count = 0; public static void main(String[] args) { for (int i = 0; i < 10; i++) { Thread thread = new Thread(new SynchronizedDemo()); thread.start(); } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(“result: ” + count); } @Override public void run() { for (int i = 0; i < 1000000; i++) count++; } }

开启了10个线程,每个线程都累加了1000000次,如果结果正确的话自然而然总数就应该是10 * 1000000 = 10000000。可就运行多次结果都不是这个数,而且每次运行结果都不一样。这是为什么了?有什么解决方案了?这就是我们今天要聊的事情。

在上一篇博文中Java内存模型以及happens-before规则我们已经了解了的一些知识,并且已经知道出现线程安全的主要来源于JMM的设计,主要集中在主内存和线程的工作内存而导致的内存可见性问题,以及重排序导致的问题,进一步知道了happens-before规则。线程运行时拥有自己的栈空间,会在自己的栈空间运行,如果多线程间没有共享的数据也就是说多线程间并没有协作完成一件事情,那么,多线程就不能发挥优势,不能带来巨大的价值。那么共享数据的线程安全问题怎样处理?很自然而然的想法就是每一个线程依次去读写这个共享变量,这样就不会有任何数据安全的问题,因为每个线程所操作的都是当前最新的版本数据。那么,在java关键字synchronized就具有使每个线程依次排队操作共享变量的功能。很显然,这种同步机制效率很低,但synchronized是其他并发容器实现的基础,对它的理解也会大大提升对并发编程的感觉,从功利的角度来说,这也是面试高频的考点。好了,下面,就来具体说说这个关键字。


http://www.taodudu.cc/news/show-8216336.html

相关文章:

  • Kotlin 1.4-M1 现已发布!
  • 图像生成、转换常用指标
  • 【论文精读】COLING 2022 -Event Detection with Dual Relational Graph Attention Networks
  • 数字化转型之道我们还需坚持!
  • p-坚持CSMA协议的具体实现流程
  • 从玩QQ农场看到做事情要坚持
  • 以后还是要坚持
  • 即使没人看我们也要坚持写Blog
  • 做一些学习的事情一定要坚持下去
  • 一定要坚持奋斗到底
  • 我要坚持,必须坚持下去
  • 一定要坚持每天写代码
  • 当anaconda拒绝中文用户名,也要坚持中文用户名
  • 一定要坚持!
  • python标准库和第三方库的方法查看
  • 两套蓝桥杯热身题
  • 河海大学第二十一届现场编程大赛-提高组 题解
  • 河海大学第二十一届现场编程大赛-普及组 初赛题解
  • 【Windows cmd】关于网络常用的命令行
  • 虚拟机安装centos6.8详细步骤和linux常用命令使用
  • 2019计算机项目部第二次培训——虚拟机安装和linux简单命令使用、重装系统
  • MyBatis使用,将Class对象的所有信息添加到SQL server并导出为XML和json
  • 2019计算机项目部第三次部门培训——Python语法基础
  • 2023年信息科学与工程学院学生科协第二次软件培训
  • 计算机项目部第三次部门培训——Python语法基础
  • 2021年信息学部物联网工程学院学生科协第三次硬件大培训
  • 工程(一)Lego_Loam安装调试及运行
  • 2014-2015 HHUC 跨年二分专题 解题报告
  • 介绍几个适用于matlab的colormap
  • 第五节 WebGL绘制、鼠标与键盘交互实例
  • 这篇关于彻底理解synchronized,很棒的博文的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/390172

    相关文章

    认识、理解、分类——acm之搜索

    普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

    【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

    【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

    【C++高阶】C++类型转换全攻略:深入理解并高效应用

    📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

    深入理解RxJava:响应式编程的现代方式

    在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

    如何通俗理解注意力机制?

    1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

    深入理解数据库的 4NF:多值依赖与消除数据异常

    在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

    分布式系统的个人理解小结

    分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

    关键字synchronized、volatile的比较

    关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

    Java IO 操作——个人理解

    之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

    理解java虚拟机内存收集

    学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以