java synchronized详解(2)

自动驾驶仿真 (三)—— 基于PreScan与Simulink的AEB系统仿真 自动驾驶仿真三—— 基于PreScan&Simulink的AEB系统仿真1. AEB自动紧急制动系统1. 1 TTC碰撞时间模型1. 2 C-NCAP法规部分术语与定义1. 3 主动安全ADAS系统试验项目2. AEB仿真分析建模2.1 搭建场景2.2 传感器建模2.3 添加AEB控制系统3. 典型工况仿真3.1 CCRs仿真测试3.1 CCRm仿真测试4. 参考学习的书目教材 博主前面的博文已经介绍了Prescan&Simulink基本的场景建模及仿真分析流程,《自动驾驶仿真 (二)—— 阅读详情

java synchronized详解(2)

2018-02-23  Java知音

点击上方“Java知音”,选择“置顶公众号”

技术文章第一时间送达!

知音专栏

 

Javaweb练手项目源码下载

常用设计模式完整系列篇

100套IT类简历模板下载

Java常见面试题汇总篇


synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。  


1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如: 

public synchronized void accessVal(int newVal);


synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。


这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。

  

在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。  


synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。  


2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:  

synchronized(syncObject) {  
//允许访问控制的代码  
}


synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。  


java中synchronized用法

打个比方:一个object就像一个大房子,大门永远打开。房子里有 很多房间(也就是方法)。这些房间有上锁的(synchronized方法), 和不上锁之分(普通方法)。房门口放着一把钥匙(key),这把钥匙可以打开所有上锁的房间。另外我把所有想调用该对象方法的线程比喻成想进入这房子某个 房间的人。所有的东西就这么多了,下面我们看看这些东西之间如何作用的。


在此我们先来明确一下我们的前提条件。该对象至少有一个synchronized方法,否则这个key还有啥意义。当然也就不会有我们的这个主题了。


一个人想进入某间上了锁的房间,他来到房子门口,看见钥匙在那儿(说明暂时还没有其他人要使用上锁的 房间)。于是他走上去拿到了钥匙,并且按照自己 的计划使用那些房间。注意一点,他每次使用完一次上锁的房间后会马上把钥匙还回去。即使他要连续使用两间上锁的房间,中间他也要把钥匙还回去,再取回来。


因此,普通情况下钥匙的使用原则是:“随用随借,用完即还。”这时其他人可以不受限制的使用那些不上锁的房间,一个人用一间可以,两个人用一间也可以,没限制。但是如果当某个人想要进入上锁的房间,他就要跑到大门口去看看了。有钥匙当然拿了就走,没有的话,就只能等了。要是很多人在等这把钥匙,等钥匙还回来以后,谁会优先得到钥匙?Not guaranteed。象前面例子里那个想连续使用两个上锁房间的家伙,他中间还钥匙的时候如果还有其他人在等钥匙,那么没有任何保证这家伙能再次拿到。 (JAVA规范在很多地方都明确说明不保证,象Thread.sleep()休息后多久会返回运行,相同优先权的线程那个首先被执行,当要访问对象的锁被 释放后处于等待池的多个线程哪个会优先得到,等等。我想最终的决定权是在JVM,之所以不保证,就是因为JVM在做出上述决定的时候,绝不是简简单单根据 一个条件来做出判断,而是根据很多条。而由于判断条件太多,如果说出来可能会影响JAVA的推广,也可能是因为知识产权保护的原因吧。SUN给了个不保证 就混过去了。无可厚非。但我相信这些不确定,并非完全不确定。因为计算机这东西本身就是按指令运行的。即使看起来很随机的现象,其实都是有规律可寻。学过 计算机的都知道,计算机里随机数的学名是伪随机数,是人运用一定的方法写出来的,看上去随机罢了。另外,或许是因为要想弄的确定太费事,也没多大意义,所 以不确定就不确定了吧。)


再来看看同步代码块。和同步方法有小小的不同。

  1. 从尺寸上讲,同步代码块比同步方法小。你可以把同步代码块看成是没上锁房间里的一块用带锁的屏风隔开的空间。

  2. 同步代码块还可以人为的指定获得某个其它对象的key。就像是指定用哪一把钥匙才能开这个屏风的锁,你可以用本房的钥匙;你也可以指定用另一个房子的钥匙才能开,这样的话,你要跑到另一栋房子那儿把那个钥匙拿来,并用那个房子的钥匙来打开这个房子的带锁的屏风。记住你获得的那另一栋房子的钥匙,并不影响其他人进入那栋房子没有锁的房间。

  

为什么要使用同步代码块呢?我想应该是这样的:首先对程序来讲同步的部分很影响运行效率,而一个方法通常是先创建一些局部变量,再对这些变量做一些 操作,如运算,显示等等;而同步所覆盖的代码越多,对效率的影响就越严重。因此我们通常尽量缩小其影响范围。


如何做?同步代码块。我们只把一个方法中该同 步的地方同步,比如运算。另外,同步代码块可以指定钥匙这一特点有个额外的好处,是可以在一定时期内霸占某个对象的key。还记得前面说过普通情况下钥匙的使用原则吗。现在不是普通情况了。你所取得的那把钥匙不是永远不还,而是在退出同步代码块时才还。还用前面那个想连续用两个上锁房间的家伙打比方。


怎样才能在用完一间以后,继续使用另一间呢?用同步代码块吧。先创建另外一个线程,做一个同步代码块,把那个代码块的锁指向这个房子的钥匙。然后启动那个线程。只要你能在进入那个代码块时抓到这房子的钥匙,你就可以一直保留到退出那个代码块。也就是说你甚至可以对本房内所有上锁的房间遍历,甚至再sleep(10*60*1000),而房门口却还有1000个线程在等这把钥匙呢。很过瘾吧。


  在此对sleep()方法和钥匙的关联性讲一下。一个线程在拿到key后,且没有完成同步的内容时,如果被强制sleep()了,那key还一直在 它那儿。直到它再次运行,做完所有同步内容,才会归还key。记住,那家伙只是干活干累了,去休息一下,他并没干完他要干的事。为了避免别人进入那个房间 把里面搞的一团糟,即使在睡觉的时候他也要把那唯一的钥匙戴在身上。


  最后,也许有人会问,为什么要一把钥匙通开,而不是一个钥匙一个门呢?我想这纯粹是因为复杂性问题。一个钥匙一个门当然更安全,但是会牵扯好多问题。钥匙 的产生,保管,获得,归还等等。其复杂性有可能随同步方法的增加呈几何级数增加,严重影响效率。这也算是一个权衡的问题吧。为了增加一点点安全性,导致效 率大大降低,是多么不可取啊。

synchronized的一个简单例子

public class TextThread {

  public static void main(String[] args) { 
    TxtThread tt = new TxtThread(); 
    new Thread(tt).start(); 
    new Thread(tt).start(); 
    new Thread(tt).start(); 
    new Thread(tt).start(); 
  } 
}

class TxtThread implements Runnable { 
int num = 100; 
String str = new String();

public void run() { 
  synchronized (str) { 
    while (num > 0) {
      try { 
        Thread.sleep(1); 
      } catch (Exception e) { 
        e.getMessage(); 
      } 
      System.out.println(Thread.currentThread().getName() 
          + "this is " + num--); 
      } 
    } 
  } 
}


上面的例子中为了制造一个时间差,也就是出错的机会,使用了Thread.sleep(10)


Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如何?――还得对synchronized关键字的作用进行深入了解才可定论。总的说来,synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。


如果再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。在进一步阐述之前,我们需要明确几点:

  1. 无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。

  2. 每个对象只有一个锁(lock)与之相关联。

  3. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。


接着来讨论synchronized用到不同地方对代码产生的影响:

假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都可以调用它们。


1. 把synchronized当作函数修饰符时,示例代码如下:

Public synchronized void methodAAA()
{
//….
}


这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。


上边的示例代码等同于如下代码:

public void methodAAA()
{
   synchronized (this)      // (1)
   {
       //…..
   }
}


(1)处的this指的是什么呢?它指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才可以调用P1的同步方法,而对P2而言,P1这个锁与它毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱。


2.同步块,示例代码如下:

public void method3(SomeObject so)
{
   synchronized(so)
   { 
        //….. 
   }
}


这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:

class Foo implements Runnable
{
       private byte[] lock = new byte[0]; // 特殊的instance变量
       Public void methodA() 
       
{
          synchronized(lock) { //… }
       }
       //…..
}


注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。


3.将synchronized作用于static 函数,示例代码如下:

Class Foo 
{
   public synchronized static void methodAAA()   // 同步的static 函数 
   
{ 
       //…. 
   }

   public void methodBBB() 
   
{
      synchronized(Foo.class)   // class literal(类名称字面常量)
   } 
}


代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。


记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不一样,不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。可以推断:如果一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为它们的锁都不一样。A方法的锁是Obj这个对象,而B的锁是Obj所属的那个Class。


小结如下:

搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。


还有一些技巧可以让我们对共享资源的同步访问更加安全:

  1. 定义private 的instance变量+它的 get方法,而不要定义public/protected的instance变量。如果将变量定义为public,对象在外界可以绕过同步方法的控制而直接取得它,并改动它。这也是JavaBean的标准实现方式之一。

  2. 如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。 这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了


  • 作者:GangWang 

  • 出处:http://www.cnblogs.com/GnagWang/ 


现代 AI Agent 编排技术全景(1)—— 分类体系与四大技术维度 本文介绍基于 LLM 的现代 Agent 分类体系与四大技术维度,形成能够刻画不同 Agent 产品架构特征的分类法 阅读详情

相关推荐

从零到一:YOLOv11高帧率模型在RDK X5上的ONNX转换与部署实战

本文详细介绍了将最新的YOLOv11高帧率模型部署到地平线RDK X5开发板的完整实战流程。内容涵盖从PyTorch模型导出ONNX、地平线工具链环境配置与模型量化编译,到编写高效的板端推理代码,并针对高帧率目标进行了后处理优化。通过实战避坑指南,帮助开发者在RDK X5上实现30FPS以上的实时目标检测。

weixin_29089057的博客 139

java synchronized 同步锁2

未加锁 package study_3; public class synTest3 { public static void main(String[] args) { Cinema cinema = new Cinema(20, "电影院1"); new Thread(new Customer(cinema, 2),"john").start(); new Thread(...

u014248032的博客 275

数电发票“乐企直连”服务平台建设方案

数字化电子发票“乐企直连”服务平台建设方案

m0_73174802的博客 4853

Java【有与无】【F2】Synchronized

Synchronized

琴韵悠悠 275

ABP多租户实现

abp会调用ITenantStore.Find(Guid)方法去查tenant是否存在。要骗过abp就得自己实现ITenantStore并替换原来的实现。abp会自动解jwt里的tenant id,并且尝试验证它。这时候我们之前实现的ITenantStore就可以骗过abp。你要不想骗它也成,反正这个类是可以依赖注入的,你爱咋验证就咋验证。不用open id dict,只用jwt,让abp轻起来。在原来生成jwt的地方加入tenantId。module上也要加DependsOn。

m0_46704355的博客 471

Agilent N5230A矢量网络分析仪在射频器件S参数测试中的关键操作指南

本文详细介绍了Agilent N5230A矢量网络分析仪在射频器件S参数测试中的关键操作流程与技巧。内容涵盖从开机预热、校准(SOLT/ECal)、参数设置(频率、点数、功率、IFBW)到连接测量、数据保存分析的全过程,并分享了夹具去嵌入、时域分析等进阶功能与常见问题避坑指南,旨在帮助工程师获得精准可靠的散射参数测试结果。

kotlin6android的博客 401

Java多线程2—synchronized

文章目录1. synchronized概念1.1 介绍1.2 实现原理1.4 Monitor对象1.3 synchronized使用场景1.4 JVM对锁机制的优化1.4.1 在Java SE 1.6时的锁机制1.4.2 偏向锁、轻量级锁1.4.3 锁实验1.4.4 JVM提出的其他优化2. 控制方法2.1 sleep()和wait()方法的区别 1. synchronized概念 1.1 介绍 synchronized不同于前面提到的ReentrantLock,其是一个Java语言提供的关键字,从某种层面

clyss1234的博客 259

手把手教你学Simulink——基于Simulink的轮毂电机独立驱动转矩矢量分配

阐述了轮毂电机独立驱动的核心价值与转矩分配的必要性在 Simulink 中实现了完整的“上层稳定控制 + 下层最优分配”架构对比了三种分配策略在极限工况下的性能差异提供了工程落地的关键考量特斯拉 Cybertruck(后轮双电机矢量控制)Rivian R1T(四电机坦克掉头)宝马 iX(精准牵引力控制)核心思想“以软件定义底盘,以算法驾驭动力;化四轮之独立,为整车之协同。—— 让汽车在极限边缘依然从容不迫。

MHD0815的博客 369

synchronized java 详解2

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。      二、然而,当一个线程访问object的一个synch

www_tobesky_com的专栏 319

详细分析一下华为自研的MetaERP系统中的合并报表流程与规则

华为MetaERP合并报表系统针对其全球化复杂业务量身定制,采用五层自动化架构:统一数据采集、多币种转换、智能对账协同、规则化抵消处理及多维分析输出。系统核心在于可配置的智能规则引擎,涵盖股权合并范围、内部交易抵消、未实现利润计算等复杂场景,实现多准则并行处理。相比传统软件,该系统深度集成业务数据、支持准实时合并,并通过参数化配置快速适应组织变革,成为华为全球财务管控的"数字神经中枢",在效率、准确性和安全性上具有显著优势。

金牌架构师 673

Android Framework SurfaceFlinger面试题及参考答案

请简述 SurfaceFlinger 在 Android 系统中的作用。 SurfaceFlinger 是 Android 系统中一个非常关键的服务。它主要负责将多个应用程序的 Surface 合成到一个屏幕显示内容中。 从应用程序的角度来看,每个应用都有自己的 UI 界面,这些 UI 界面实际上是由一系列的图层(Surface)构成。例如,一个应用可能有背景图层、按钮图层、文本图层等。应用通过向 SurfaceFlinger 提供这些 Surface 来请求显示。 SurfaceFl

大模型大数据攻城狮的专栏 1185

Java synchronized(2)

java synchronized

Lucy_Leezhi 349

嵌入式开发板OpenClaw部署:ESP32-S3与RISC-V平台性能评估

ESP32-S3与RISC-V平台在OpenClaw部署中的性能评估 本文对比分析了ESP32-S3和RISC-V两种嵌入式平台在OpenClaw部署中的性能表现。ESP32-S3凭借240MHz双核Xtensa LX7处理器和专用AI加速器,特别适合轻量级AI推理任务;而RISC-V凭借开源架构和模块化设计,可实现更高的能效比。文章详细介绍了ESP32-S3-DevKitC-1、SiFive HiFive1等典型开发板的硬件规格,推荐了ESP-IDF和FreeRTOS等操作系统,并提供了完整的开发环

博客 1127

【JAVA 基础】 2、 Java中Synchronized的用法

public static void main(String[] args) { System.out.println("使用关键字synchronized"); Mthreads mt=new Mthreads(); Thread thread1 = new Thread(mt, "mt1"); Thread thread2 = new Thread(mt...

落霞与孤鹜齐飞,秋水共长天一色。 184

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java并发2-精通Synchronized

本文是学习Java并发变成实战的笔记。 1.demo序 先从一个demo入局: public class SynchronizedDemo implements Runnable { private static int count = 0; public static void main(String[] args) { for (int i = 0; i &l...

weixin_43103956的博客 249

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java多线程(2)synchronized详解

上一篇:Java多线程(1)线程与进程 synchronized详解 简介 可能在很多人眼里,在java中提到 锁、安全性、同步,首先想到的则是java提供的大佬(synchronized)。那么为什么在多线程下,单单靠一个关键字修饰代码块就可以实现所谓的安全性呢?可以说是对初学者而言及神奇又强大的存在。也成了大多数初学者百试不爽的良药 但是在逐渐对java认知的深入,我们认识到synchronized对于jvm来说是一个重量级的锁。其笨重无比,在如今人们对速度和性能极致要求的现在,现在此时并不能满足性能上

haiyanghan的博客 388

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java中synchronized(2):使用方法

synchronized使用方法 synchronized 同步锁可分为以下俩种使用方法: 1.对象锁 方法锁:直接用synchronized修饰普通方法 方法代码块:引用当前对象或自定义对象作为锁 2.类锁 staticmethod锁:用synchronized修饰static方法 下面我们来演示两种锁的使用方法 1.对象锁 1.1方法锁 1.2方法代码块 ...

u013938578的博客 189

JAVA 2 synchronized的用法

synchronized  一般以对象的形似存在。 使用并发时,将域设置为private,否则synchronized就不能阻止其他任务直接访问域。 何时用同步:  如果你正在写一个变量,它接下来可能将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你必须使用同步。 并且读写线程都必须用相同的监视器锁同步。   一、当两个并发线程访问同一个

u011594613的专栏 325

Java Thread线程2—线程锁synchronized,Lock,volatile

写法锁对象适用场景粒度同步实例方法this保护实例变量粗同步静态方法Class<?保护静态变量粗同步代码块(this)this与同步实例方法等价中同步代码块(任意对象)任意对象细粒度锁、减少竞争细。

luck_xiang的博客 815

java synchronized 详解 (2)

感觉 这篇文章不错就转了下来, synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:synchronized 方法和 synchronized 块。 1. synchr...

a new Road 132

JAVA多线程学习2之synchronized

实现原理:   synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。java中每一个对象都可以作为锁,这是synchronized实现同步的基础。 安全问题:   多线程引发的安全问题,由于多个线程共享了数据,且一个线程在操作(多为写)数据的过程中,可能同时对某个数据进行操作,从而导致数据出错,由此我...

qq_34670974的博客 158

Java初学习 - synchronized与static synchronized 的区别(2)

JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。假如再细的分类,synchronized可作用于instance变量、object reference(对象引用,例如this)、static函数和class literals(类名称字面常量)身上。下面讨论synchronized用到不同地方对代码产生的影响: 假设P1、

myKernel 639

Java多线程与并发2-Synchronized

Synchronized synchronized是Java中实现线程安全的基本方式,其底层就是通过加锁的方式控制 基本用法 2个维度来看, 修饰位置 代码块,修饰对象分为变量、实例或者class对象; 方法,分为静态方法和普通方法。 加锁对象 对象锁,作用于调用方法的对象实例上; 类锁,作用于对象类上。 修饰普通方法 /** * 对象锁, 方法级别, 同一对象争用该锁,普通(非...

wustfrank的专栏 254

Java锁系列——2、Synchronized 锁实现原理

概述 上篇博客我简单介绍了 Synchronized 锁的三种使用方法及部分特性,作为开发者,适当的了解原理可以加深我们对它的理解。因此,本篇博客打算从底层介绍一下 Synchronized 锁实现的原理。 Synchronized 锁实现原理 本篇博客从以下几个模块展开: 对象头 Monitor 对象 显式同步和隐式同步 Monitor 对象与线程状态 1、 对象头 在 java 代码中,对象创建完成后,在堆区分以下三个模块存储: 对象头 实例数据 填充数据 其中实例数据主要保存类属性及数据信

meiyongdesan的博客 379

Java 并发2 -- volatile 和 synchronized

一是保证特定操作的执行顺序 --> 由于编译器和处理器都能执行指令重排优化,如果在指令间插入一条 MemoryBarrier,则会告诉编译器和CPU,不管什么指令都不能喝这条 MemoryBarrier 指令重排序,也就是通过插入内存屏障,禁止内存屏障前后的指令执行重排序优化。二是保证某系变量的内存可见性(利用该特性实现 volatile 的内存可见性)-> 内存栅栏会强制刷出各种 CPU 缓存数据,因此 任何 CPU 上的线程都能读取到这些数据的最新版本。锁状态说明无锁。

wangqiang996的博客 166

Java juc系列2 —— synchronized关键字

Java JUC系列目录链接 Java juc系列2 —— synchronized关键字JDK1.5后的synchronizedJava多线程 synchronized关键字的用法JAVA对象组成结构对象的多种锁状态锁的升级过程无锁—>偏向锁偏向锁—>轻量级锁轻量级锁 —>自旋锁(某种意义上这只是一种自旋的状态,并不叫锁)自旋锁—>重量级锁synchronized和Lock JDK1.5后的synchronized Java多线程 synchronized关键字的用法 我们都知道s

seethefuture的博客 294
上一篇: java synchronized详解(1)
下一篇: 使用apache commons-io的FileUtils.copyFile简单地复制文件
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值