彻底理解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

    相关文章

    一文带你理解Python中import机制与importlib的妙用

    《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

    深入理解C语言的void*

    《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

    深入理解Redis大key的危害及解决方案

    《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

    深入理解C++ 空类大小

    《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

    认识、理解、分类——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,帮助你在数据库设计中消除更高级别的异常。 什么是