• Posted by 微博@Yangsc_o
  • 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

文章目录

  • 摘要
  • synchronized的基础用法
  • synchronized原理
    • 字节码理解
      • 认识 Java Monitor Object
      • 代码验证
    • 虚拟机实现原理
      • 一个对象的内存布局
      • 对象头
      • 对象实际数据
      • 对齐填充
      • 对象头占用空间大小
      • 指针压缩
      • 什么是OOP?
      • 启用指针压缩
      • 测试验证
  • 你的鼓励也是我创作的动力

摘要

本文从synchronized的基本用法,结合对象的内存布局,深入探究synchronized的锁升级的过程,探究其实现原理。准备开始~

synchronized的基础用法

  1. 修饰普通同步⽅方法

    对于非static的情况,synchronized是对象级别的,其实质是将synchronized作用于对象引用(object reference)上,即拿到p1对象锁的线程,对的fun()方法有同步互斥作用,不同的对象之间坚持“和平共处”。

    // 锁的对象是方法的调用者
    public synchronized void method(){}
    

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

    public void method() {synchronized (this) {}
    }
    
  2. 修饰静态同步方法

    如果方法用static修饰,synchronized的作用范围就是class一级的,它对类的所有对象起作用。

    Class Foo{public static synchronized void method1() {}
    }
    

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

    public void method2()
    {synchronized(Foo.class) {// class literal(类名称字面常量)//请注意,Foo.class也是一个对象,类型是Class,在一个ClassLoader里,它是唯一的。}
    }
  3. 修饰同步代码块

    锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。

    同步块,示例代码如下:

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

    当有一个明确的对象作为锁时,就能够这样写代码,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(它得是个对象)来充当锁

    class Foo implements Runnable{private byte[] lock = new byte[0]; // 特别的instance变量Public void method(){synchronized(lock) { }
    }
    
    • 注:零长度的byte数组对象创建起来将比任何对象都经济。查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。

特殊说明

  • 使⽤用synchronized修饰类和对象时,由于类对象和实例例对象分别拥有⾃自⼰己的监视器器锁,因此不不会
    相互阻塞
  • 使⽤synchronized修饰实例例对象时,如果一个线程正在访问实例例对象的一个synchronized方法时,其它线程不仅不能访问该synchronized⽅法,该对象的其它synchronized方法也不不能访问,因为一个对象只有一个监视器器锁对象,但是其它线程可以访问该对象的非synchronized⽅法。

synchronized原理

字节码理解

在说synchronized原理时,就不得不先了解一下Monitor

认识 Java Monitor Object

Java Monitor 从两个方面来支持线程之间的同步,即:互斥执行(对象内的所有方法都互斥的执行。好比一个 Monitor 只有一个运行许可,任一个线程进入任何一个方法都需要获得这个许可,离开时把许可归还)与协作(通常提供signal机制:允许正持有许可的线程暂时放弃许可,等待某个监视条件成真,条件成立后,当前线程可以通知正在等待这个条件的线程,让它可以重新获得运行许可)。 Java 使用对象锁 ( 使用 synchronized 获得对象锁 ) 保证工作在共享的数据集上的线程互斥执行 , 使用 notify/notifyAll/wait 方法来协同不同线程之间的工作。这些方法在 Object 类上被定义,会被所有的 Java 对象自动继承。

Java 语言对于这样一个典型并发设计模式做了内建的支持,线程如果获得监视锁成功,将成为该监视者对象的拥有者。在任一时刻内,监视者对象只属于一个活动线程 (Owner) 。拥有者线程可以调用 wait 方法自动释放监视锁,进入等待状态。下图很好地描述了 Java Monitor 的工作机理。

image-20200601145801572

在Java虚拟机(HotSpot)中, monitor是由ObjectMonitor实现的,其主要数据结构如下(位于HotSpot虚拟机源码ObjectMonitor.hpp⽂文件,C++实现的),位于/openjdk-8u60/hotspot/src/share/vm/runtime/objectMonitor.hpp

ObjectMonitor() {
_header = NULL; //markOop对象头
_count = 0;     // 可以⼤大于1,可重⼊入
_waiters = 0,   //等待线程数
_recursions = 0; //重⼊入次数
_object = NULL; //监视器器锁寄⽣生的对象。锁不不是平⽩白出现的,⽽而是寄托存储于对象中。
_owner = NULL;  //初始时为NULL表示当前没有任何线程拥有该monitor record,当线程成功拥有该锁后保存线程唯⼀一标识,当锁被释放时⼜又设置为NULL
_WaitSet = NULL; //处于wait状态的线程,会被加⼊入到_WaitSet
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ;
FreeNext = NULL ;
_EntryList = NULL ; //处于等待锁block状态的线程,会被加⼊入到该列列表
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
_previous_owner_tid = 0;
}

每个线程都有两个ObjectMonitor对象列列表,分别为free和used列列表,如果当前free列列表为空,线程将
向全局global list请求分配ObjectMonitor。thread结构/openjdk-8u60/hotspot/src/share/vm/runtime/thread.hpp

  // Private thread-local objectmonitor list - a simple cache organized as a SLL.public:ObjectMonitor* omFreeList;int omFreeCount;                              // length of omFreeListint omFreeProvision;                          // reload chunk sizeObjectMonitor* omInUseList;                   // SLL to track monitors in circulationint omInUseCount;                             // length of omInUseList

ObjectMonitor中有两个队列列, _WaitSet 和 _EntryList,用来保存ObjectWaiter对象列列表( 每个等待锁的线程都会被封装成ObjectWaiter对象), owner指向持有ObjectMonitor对象的线程,当多个线程同时访问一段同步代码时,首先会进⼊入 EntryList 集合,当线程获取到对象的monitor 后进⼊ _Owner 区域并把monitor中的owner变量量设置为当前线程同时monitor中的计数器器count加1,若线程调⽤用 wait() ⽅法,将释放当前持有的monitor, owner变量量恢复为null, count⾃自减1,同时该线程进⼊入 WaitSet集合中等待被唤醒。若当前线程执⾏行行完毕也将释放monitor(锁)并复位变量量的值,以便便其他线程进⼊入获取monitor(锁)。

由此看来, monitor对象存在于每个Java对象的对象头中(存储的指针的指向), synchronized锁便是通过这种⽅式获取锁的,也是为什么Java中任意对象可以作为锁的原因。


代码验证

是不是一脸崩?不知道在说什么🤷‍♂️?

  • 先看一张图

    概括一下就是synchronized后,在程序执行的过程中会有被监听的过程,过程可以概括为:获取监听器、dosomething、释放监听器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FMJid3SI-1591005001677)(https://gitee.com/yangsanchao/images/raw/master/blogs/image-20200601154728023.png)]

  • 测试验证代码
public class ObjectLayout {public static synchronized void test(){}public synchronized void test1(){}public static void main(String[] args) {Object obj = new Object();System.out.println(ClassLayout.parseInstance(obj).toPrintable());synchronized (obj){System.out.println(ClassLayout.parseInstance(obj).toPrintable());}ObjectLayout.test();ObjectLayout objectLayout = new ObjectLayout();objectLayout.test1();}
}
  • 编译为字节码
 0 new #2 <java/lang/Object>3 dup4 invokespecial #1 <java/lang/Object.<init>>7 astore_18 getstatic #3 <java/lang/System.out>
11 aload_1
12 invokestatic #4 <org/openjdk/jol/info/ClassLayout.parseInstance>
15 invokevirtual #5 <org/openjdk/jol/info/ClassLayout.toPrintable>
18 invokevirtual #6 <java/io/PrintStream.println>
21 aload_1
22 dup
23 astore_2
24 monitorenter
25 getstatic #3 <java/lang/System.out>
28 aload_1
29 invokestatic #4 <org/openjdk/jol/info/ClassLayout.parseInstance>
32 invokevirtual #5 <org/openjdk/jol/info/ClassLayout.toPrintable>
35 invokevirtual #6 <java/io/PrintStream.println>
38 aload_2
39 monitorexit
40 goto 48 (+8)
43 astore_3
44 aload_2
45 monitorexit
46 aload_3
47 athrow
48 invokestatic #7 <com/yangsc/juc/ObjectLayout.test>
51 new #8 <com/yangsc/juc/ObjectLayout>
54 dup
55 invokespecial #9 <com/yangsc/juc/ObjectLayout.<init>>
58 astore_2
59 aload_2
60 invokevirtual #10 <com/yangsc/juc/ObjectLayout.test1>
63 return

可以看到,在synchronized (obj){}被monitorenter和moniterexit包裹了!

  • 静态同步⽅法&同步⽅法

    字节码中会标记为volatile,后续交由虚拟机处理;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t7Zegxu9-1591005001685)(https://gitee.com/yangsanchao/images/raw/master/blogs/image-20200601163715362.png)]

    image-20200601163752725


虚拟机实现原理

一个对象的内存布局

在更进一步的深入之前,我们需要了解一下Java对象在内存的布局,一个Java对象包括对象头、实例数据和补齐填充3个部分:

image-20200601110924039

对象头

  • Mark Word:包含一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等。在32位系统占4字节,在64位系统中占8字节;
  • Class Pointer:用来指向对象对应的Class对象(其对应的元数据对象)的内存地址。在32位系统占4字节,在64位系统中占8字节;
  • Length:如果是数组对象,还有一个保存数组长度的空间,占4个字节;

对象实际数据

对象实际数据包括了对象的所有成员变量,其大小由各个成员变量的大小决定,比如:byte和boolean是1个字节,short和char是2个字节,int和float是4个字节,long和double是8个字节,reference是4个字节(64位系统中是8个字节)。

image-20200601111155976

对于reference类型来说,在32位系统上占用4bytes, 在64位系统上占用8bytes。

对齐填充

Java对象占用空间是8字节对齐的,即所有Java对象占用bytes数必须是8的倍数。例如,一个包含两个属性的对象:int和byte,这个对象需要占用8+4+1=13个字节,这时就需要加上大小为3字节的padding进行8字节对齐,最终占用大小为16个字节。

注意:以上对64位操作系统的描述是未开启指针压缩的情况,关于指针压缩会在下文中介绍。

对象头占用空间大小

这里说明一下32位系统和64位系统中对象所占用内存空间的大小:

  • 在32位系统下,存放Class Pointer的空间大小是4字节,MarkWord是4字节,对象头为8字节;
  • 在64位系统下,存放Class Pointer的空间大小是8字节,MarkWord是8字节,对象头为16字节;
  • 64位开启指针压缩的情况下,存放Class Pointer的空间大小是4字节,MarkWord是8字节,对象头为12字节;
  • 如果是数组对象,对象头的大小为:数组对象头8字节+数组长度4字节+对齐4字节=16字节。其中对象引用占4字节(未开启指针压缩的64位为8字节),数组MarkWord为4字节(64位未开启指针压缩的为8字节);
  • 静态属性不算在对象大小内。

指针压缩

从上文的分析中可以看到,64位JVM消耗的内存会比32位的要多大约1.5倍,这是因为对象指针在64位JVM下有更宽的寻址。对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到的。

从JDK 1.6 update14开始,64位的JVM正式支持了 -XX:+UseCompressedOops 这个可以压缩指针,起到节约内存占用的新参数。

什么是OOP?

OOP的全称为:Ordinary Object Pointer,就是普通对象指针。启用CompressOops后,会压缩的对象:

  • 每个Class的属性指针(静态成员变量);
  • 每个对象的属性指针;
  • 普通对象数组的每个元素指针。

当然,压缩也不是所有的指针都会压缩,对一些特殊类型的指针,JVM是不会优化的,例如指向PermGen的Class对象指针、本地变量、堆栈元素、入参、返回值和NULL指针不会被压缩。

启用指针压缩

在Java程序启动时增加JVM参数:-XX:+UseCompressedOops来启用。

注意:32位HotSpot VM是不支持UseCompressedOops参数的,只有64位HotSpot VM才支持。

本文中使用的是JDK 1.8,默认该参数就是开启的。


扯了半天一个java对象在内存的布局,其实针对此文,重点需要关注markword

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t0PDPmDf-1591005001698)(https://gitee.com/yangsanchao/images/raw/master/blogs/image-20200601112747613.png)]

我们也可以在jdk的’/openjdk-8u60/hotspot/src/share/vm/memory/universe.hpp’中看到相关描述

// Bit-format of an object header (most significant first, big endian layout below):
//
//  32 bits:
//  --------
//             hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
//             JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
//             size:32 ------------------------------------------>| (CMS free block)
//             PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)
//
//  64 bits:
//  --------
//  unused:25 hash:31 -->| unused:1   age:4    biased_lock:1 lock:2 (normal object)
//  JavaThread*:54 epoch:2 unused:1   age:4    biased_lock:1 lock:2 (biased object)
//  PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
//  size:64 ----------------------------------------------------->| (CMS free block)
//
//  unused:25 hash:31 -->| cms_free:1 age:4    biased_lock:1 lock:2 (COOPs && normal object)
//  JavaThread*:54 epoch:2 cms_free:1 age:4    biased_lock:1 lock:2 (COOPs && biased object)
//  narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object)
//  unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)
//
------------------省略部分描述------------------
//    [JavaThread* | epoch | age | 1 | 01]       lock is biased toward given thread
//    [0           | epoch | age | 1 | 01]       lock is anonymously biased
//
//  - the two lock bits are used to describe three states: locked/unlocked and monitor.
//
//    [ptr             | 00]  locked             ptr points to real header on stack
//    [header      | 0 | 01]  unlocked           regular object header
//    [ptr             | 10]  monitor            inflated lock (header is wapped out)
//    [ptr             | 11]  marked             used by markSweep to mark an object
//                                               not valid at any other time
//
//    We assume that stack/thread pointers have the lowest two bits cleared.

测试验证

public class ObjectLayout1 {public static void main(String[] args) {MyObj obj = new MyObj();System.out.println(ClassLayout.parseInstance(obj).toPrintable());synchronized (obj) {System.out.println(ClassLayout.parseInstance(obj).toPrintable());}for (int i = 0; i < 100; i++) {new Thread(()->{obj.add();}).start();}System.out.println(ClassLayout.parseInstance(obj).toPrintable());}
}class MyObj {private Integer count = 0;public synchronized void add() {count++;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}
}
  • 不加锁

    00000001 对应无锁状态

com.yangsc.juc.MyObj object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 6e 37 02 f8 (01101110 00110111 00000010 11111000) (-134072466)
12 4 java.lang.Integer MyObj.count 0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

  • 偏向锁

    10010000 对应轻量级标志位

com.yangsc.juc.MyObj object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 90 69 30 0c (10010000 01101001 00110000 00001100) (204499344)
4 4 (object header) 00 70 00 00 (00000000 01110000 00000000 00000000) (28672)
8 4 (object header) 6e 37 02 f8 (01101110 00110111 00000010 11111000) (-134072466)
12 4 java.lang.Integer MyObj.count 0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

  • 重量级锁

    01111010 对应重量级锁标志位

com.yangsc.juc.MyObj object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 7a a8 80 4e (01111010 10101000 10000000 01001110) (1317054586)
4 4 (object header) ba 7f 00 00 (10111010 01111111 00000000 00000000) (32698)
8 4 (object header) 6e 37 02 f8 (01101110 00110111 00000010 11111000) (-134072466)
12 4 java.lang.Integer MyObj.count 1
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

上面的markword验证锁升级的过程,但是Hotspot是如何实现呢?


你的鼓励也是我创作的动力

打赏地址

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 分布式计算模式之流水线

    前言 在分布式领域中解决类似具有依赖关系的流水线作业的计算模式,叫作流水线计算模式。其实,流水线计算模式就是将一个任务拆分为多个步骤(子任务),然后多个这样的任务通过对步骤(子任务)的重叠执行,以实现数据并行处理的场景。 这种流水线模式在计算机领域中最先用于…...

    2024/4/16 9:36:38
  2. 人工神经网络之深度学习之股市庄家操作分析03

    武当和少林作为武侠小说里面天下武功之鼻祖,原本是宗教圣地,却变成武林之首。气功作为武侠小说里面神乎其神的东西,变成特异功能的发源地。其实,古代的人很早就发现,人类需要空气,空气是看不见的,但是可以摸得着。风吹到人的身上,会感觉得到。风把灰尘吹起来的时候,把…...

    2024/4/24 9:49:23
  3. 腾讯云安全组创建以及配置流程介绍

    腾讯云安全组创建以及配置流程介绍 腾讯云服务器购买之后,如果在购买过程中我们没有设置好安全组规则,那么在购买之后,我们要做的第一件事就是设置好安全组规则,否则服务器很多功能我们是无法使用的,下面赵一八笔记教下大家腾讯云安全组是如何创建以及配置的: 安全组创建…...

    2024/4/24 9:49:21
  4. iOS URL Loading System 简介

    1 总览 URL Loading System 提供获取资源的能力通过URLs,使用标准https协议或者是开发者自定义的协议。使用标准Internet协议与URL交互并与服务器通信。且加载执行的过程是异步的,保证了应用界面响应与处理加载数据的同时执行。 您可以使用一个URLSession实例来创建一个或多个…...

    2024/4/24 9:49:22
  5. 云原生是企业数字化转型的通关密码的原因

    导读2020年,受疫情影响,谁家企业的日子都不好过。但是,如果把互联网企业和传统企业放在一起进行对比,就会发现,后者已被无形碾压。为什么传统企业或者是行业压力更大?2020年,受疫情影响,谁家企业的日子都不好过。但是,如果把互联网企业和传统企业放在一起进行对比,就…...

    2024/4/27 23:34:10
  6. CIO40: “数字化转型”是万能药?

    2020 数字化转型是万能药?脚踏实地,一步步来,有可能是个大坑 适合才是万能药 顺应时代潮流而已 毒药才是万能药,一了百了 转型两个字要琢磨下 转型是万能的,前面定语。。。。 更多像春药 灵魂③问:1什么是数字化?2转什么?3怎么转? 要么找死要么等死,找死可能是向死而…...

    2024/4/28 1:47:06
  7. 三行按键扫描

    新型的按键扫描程序 不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。 同时,这里面用到了…...

    2024/4/27 21:23:41
  8. 处理移动端首页返回键不能返回到登录页面的问题

    前言在开发项目时,总会遇到首页点击返回键就会跑到登录页去,登录页点击返回又跑到其他页面,为了防止这种现象发生,个人联合了两种方法解决的这个问题,第一种是通过监听来阻止此事件发生,第二种是利用vue的导航守卫来阻止。 方法一当在首页时,不想返回到登录页,我采用第…...

    2024/4/27 23:17:21
  9. NLP的顶会

    ACL、EMNLP、NAACL - HLT、COLING 是 NLP 领域的四大顶会 其中ACL和EMNLP特别受到关注,如果关注一些好的最新的工作,就看这个两个会议,在里面搜一下你所做的方向的文章...

    2024/4/24 9:49:16
  10. 教育部发布第二批在疫情期间支持高校在线教学的产学合作教学资源名单

    教育部发布第二批在疫情期间支持高校在线教学的产学合作教学资源名单为进一步丰富高校在疫情防控期间开展在线教学的课程及平台资源,教育部产学合作协同育人项目专家组面向项目参与企业开展了项目成果及资源征集活动,有关企业积极响应、踊跃申报。根据疫情防控期间高校在线教…...

    2024/4/26 8:56:53
  11. java常用设计模式 ----单例模式(简单易懂)

    单例模式 一、什么是单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问点,实现单例模式的方法是私有化构造函数,通过getInstance()方法实例化对象,并返回这个实例 二、单例模式应用场景项目中定义的配置文件 Servlet对象默认就是单例 线程池、数据库连接池 Spri…...

    2024/4/27 1:08:36
  12. 我的开源的MVC 的Unity 架构

    大概是在17年初写的功能,现在已经过了二年之久,实际上,我的这块的技术并没有显著的提升, 进入游戏公司可能更多也只是业务能力上面的学习,这个项目确实垃圾,但开源了可惜少有人关注,我觉得还是有些可惜,所以特此发出来咳咳,那么我们着重介绍下,我这里实现那些78玩意吧…...

    2024/4/24 9:49:12
  13. 新冠肺炎,或将改变世界经济以及格局

    一转眼,2020年已经要过去一半了,这个特别的2020,像这串特殊的数字一样,一开年,就给人们留下了不一样的开始,凡是经历过的人,一定铭记终身。 受疫情影响,无疑对当前中国乃至全球经济都造成了深刻的影响。从零售餐饮、住宿旅游、交通运输、文化娱乐等行业营收大幅下滑,到…...

    2024/4/24 9:49:11
  14. 海尔智慧电视如何进入工厂模式

    按电视机身或遥控器信号源,切换到模拟电视模式,按菜单键弹出菜单,,同时依次按8893即可进入工厂模式。亲测:H32E07A。其他型号方法如下:<一>1、通过电视的数字遥控器,在设置中选择声音2113,根据声音按键进行调节2、你会发现系统设置5261里4102多出很多东西,ADB调…...

    2024/4/16 9:37:29
  15. Java接口防刷策略(自定义注解实现)

    目的短信发送及短信验证码校验接口防刷 一方面防止用户循环调用刷短信验证码 另一方面防止用户循环调用测短信验证码(一般短信验证码为6位纯数字,一秒钟上百次调用,如果不做限制很快就能试出来了) 很多接口需要防止前端重复调用 误操作多次点击,不属于攻击类型,正常用户经…...

    2024/4/16 9:37:09
  16. VS2017下载地址和安装教程(图解)

    继 VS2015 版本后,微软又推出了功能更加强大的VS 2017。 Visual Studio 2017 不仅支持 C#、C++、Python、Visual Basic、Node.js、HTML、JavaScript 等各大编程语言,还能开发 iOS、Android 的移动平台应用,VS 2017 甚至还自带了 iOS 模拟器(之前为 MAC 独享的开发环境)。 …...

    2024/4/16 9:37:34
  17. 多环境部署及打包运行

    一、不通环境部署运行配置application.yml 在总配置文件中配置相应的参数值:###配置项目名称和多环境动态打包 spring:application:name: engineeringprofiles:active: @profileActive@不同的环境的文件:application 后面加上你自定义的名称如:application-dev 开发环境 …...

    2024/4/16 9:37:34
  18. 边缘计算体验之二:简单高可用 ZStack Mini的巧妙设计

    转载自公众号:E企研究院 不管是中文的“健壮”,还是英文的“Strong”,通常用于形容人或动物的体格,并隐含拥有更高的生存能力,或者说在受伤失去部分生理机能后,拥有更快恢复正常的能力。 正是因为这一词潜在的含义,也被借用以描述IT系统或应用程序的特点之一,比如应用程…...

    2024/4/23 2:08:51
  19. spring boot项目中集成WebSocket,实现消息推送

    spring boot项目中集成WebSocket,实现消息推送 WebSocket简介 WebSocket 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。 spring boot项目中集成websocket 1.添加maven依赖<depen…...

    2024/4/19 5:36:19
  20. C程序设计语言 4-13

    练习4-13 编写一个递归版本的reversed(s)函数,以将字符串s倒置;递归顺序如图, 有一个含四个字符的字符串,递归到最底层的时候先互换cd两个字符,然后回到上一层,交换bdc三个字符,然后再回到上一层,交换adcb四个字符,此时字符串已完成逆序。虽然到第四章还没有学到指针,…...

    2024/4/16 9:37:39

最新文章

  1. 嵌入式Linux学习——Ubantu初体验

    Ubuntu 和Windows 的最大差别 Windows中的每一个分区都对应着一个盘符&#xff0c;盘符下可以存放目录与文件&#xff0c;而在Ubantu中没有盘符的概念&#xff0c;只有目录结构。实际上不同的目录可能挂载在不同的分区之下&#xff0c;如果想要查看当前目录位于磁盘的哪个分区…...

    2024/4/28 2:30:27
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Spring集成MyBatis

    基本准备 创建Dynamic Web Project 引入相关jar包 Spring框架相关jar包 MyBatis连接Spring相关jar包 连接MySQL驱动包 JSTL标签库包 添加db.properties文件&#xff0c;该属性文件配置连接数据库相关信息 drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/myba…...

    2024/4/23 6:22:22
  4. JVM专题——类文件结构

    本文部分内容节选自Java Guide和《深入理解Java虚拟机》, Java Guide地址: https://javaguide.cn/java/jvm/class-file-structure.html &#x1f680; 基础&#xff08;上&#xff09; → &#x1f680; 基础&#xff08;中&#xff09; → &#x1f680;基础&#xff08;下&am…...

    2024/4/27 18:01:36
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57