首页 > 其他分享 >彻底理解synchronized(转载)

彻底理解synchronized(转载)

时间:2023-05-18 16:48:39浏览次数:37  
标签:转载 synchronized 彻底 Thread 线程 内存 多线程 public

synchronized简介

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

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

synchronized实现原理

在java代码中使用synchronized可是使用在代码块和方法中,根据synchronized用的位置可以有如表3.1这些使用场景:

       
       
       
       
       
       

 

标签:转载,synchronized,彻底,Thread,线程,内存,多线程,public
From: https://www.cnblogs.com/grassLittle/p/17412401.html

相关文章

  • [转载]lsattr -I -e 文件扩展属性的一些解释
    排查时遇到的问题此文章做出了一些解答,转载以作为记录,源文章地址https://blog.systemctl.top/2017/2017-04-14_something-about-lsattr_-i_-e/1.如图e是什么?I又代表什么?这个问题我觉得不是个难问题,简单man下就出来了,可问题来了,更多的系列问题更是随之而来…manlsattr......
  • 转载:【推荐】云服务器推荐
    用过,才知道。因此写了篇云服务器推荐:原地址:原创:【推荐】云服务器推荐-知乎一、阿里云:推荐云服务:推荐海外云服务器:轻量应用服务器_web服务器_个人建站_弹性计算-阿里云​  阿里云-云服务器优点:1、同类产品综合性能优;2、响应速度快:经过使用后得出:海外轻量服务器响应速......
  • synchronized、Lock 为什么要设计成可重入
    为什么监视器锁(ObjectMonitor)、Lock要设计成可重入的目的主要有两个1、防止死锁2、面向对象更好的封装代码先看一段代码@Slf4jpublicclassSynchronizedDemo{privatestaticfinalObjectlock=newObject();publicstaticvoidmain(String[]args){......
  • 【转载】SpringBoot自带的工具类
    断言对象、数组、集合ObjectUtilsStringUtilsCollectionUtils文件、资源、IO流FileCopyUtilsResourceUtilsStreamUtils反射、AOPReflectionUtils[AopUtils][AopContext]最近发现同事写了不少重复的工具类,发现其中很多功能,Spring自带的都有。于是整......
  • 【转载】代码命名规范
    管理类命名传播类命名回调类命名监控类命名内存管理类命名过滤检测类命名结构类命名常见设计模式命名解析类命名网络类命名CRUD命名其他End日常编码中,代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图,也是一项必备的能力。那它们有什么规律呢?Java项......
  • [转载]尴尬的MPS&MRP
    转自:https://www.logclub.com/articleInfo/Mzg1MjM= 我在几年前曾经写过一篇关于MRP的文章《为何MPS&MRP总是跑不起来,赌徒与赌场的玩法》,这篇文章也被收录到与刘宝红老师合作的《供应链三道防线》中。这篇文章主要是和大家深度分享了为何大部分企业即使上了强大的ERP系统,也无法......
  • 【转载】基于物料限制逆向实现产品组合的最优规划
    原文:https://www.logclub.com/articleInfo/NTEwNzg= 在之前的案例中,我们分享的主要是如何用算法模型来提高决策效率与质量,并以此节约运营成本,整体上是如何把已有的事情做的更快更好。这次给大家分享的是,过去比较少见,但是当前越发频繁的场景,就是关键物料短缺下如何实现资源效率......
  • http cache 笔记转载
    HTTP协议的Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会影响另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括:no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached等。响应消息中的指令包括:publi......
  • Java中的位运算符号详解(&、|、^、~、<<、>>、>>>)(转载)
    位运算符号概览符号描述运算规则&与两个位都为1时,结果才为1|或两个位都为0时,结果才为0^异或两个位相同为0,不同为1~取反所有位置0变1,1变0<<左移各二进位全部左移若干位,高位丢弃,低位补0>>带符号右移各二进位全部右移若干位,低位丢弃,高位补为符......
  • 彻底删除IDEA 2022.03.03
     rm-rf/Users/XXX/Library/Preferences/jetbrains.jetprofile.asset.plistrm-rf/Users/XXX/Library/Preferences/com.jetbrains.*rm-rf/Users/XXX/Library/Caches/JetBrainsrm-rf/Users/XXX/Library/Application\Support/JetBrainsrm-rf/Users/XXX/Library/Logs/......