并发(三)–synchronized的理解(以及锁升级)

一、Synchronized的基本使用

Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。

Synchronized的作用主要有三个:

  • 确保线程互斥的访问同步代码
  • 保证共享变量的修改能够及时可见
  • 有效解决重排序问题

语法上讲,Synchronized总共有三种用法

  • 修饰普通方法
  • 修饰静态方法
  • 修饰代码块

接下来我就通过几个例子程序来说明一下这三种使用方式(为了便于比较,三段代码除了Synchronized的使用方式不同以外,其他基本保持一致)。

1、没有同步的情况:

代码段一:

package com.paddx.test.concurrent;public class SynchronizedTest {public void method1(){System.out.println("Method 1 start");try {System.out.println("Method 1 execute");Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Method 1 end");}public void method2(){System.out.println("Method 2 start");try {System.out.println("Method 2 execute");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Method 2 end");}public static void main(String[] args) {final SynchronizedTest test = new SynchronizedTest();new Thread(new Runnable() {@Overridepublic void run() {test.method1();}}).start();new Thread(new Runnable() {@Overridepublic void run() {test.method2();}}).start();}
}

执行结果如下,线程1和线程2同时进入执行状态,线程2执行速度比线程1快,所以线程2先执行完成,这个过程中线程1和线程2是同时执行的。

Method 1 start
Method 1 execute
Method 2 start
Method 2 execute
Method 2 end
Method 1 end

2、对普通方法同步:

代码段二:

package com.paddx.test.concurrent;public class SynchronizedTest {public synchronized void method1(){System.out.println("Method 1 start");try {System.out.println("Method 1 execute");Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Method 1 end");}public synchronized void method2(){System.out.println("Method 2 start");try {System.out.println("Method 2 execute");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Method 2 end");}public static void main(String[] args) {final SynchronizedTest test = new SynchronizedTest();new Thread(new Runnable() {@Overridepublic void run() {test.method1();}}).start();new Thread(new Runnable() {@Overridepublic void run() {test.method2();}}).start();}
}

执行结果如下,跟代码段一比较,可以很明显的看出,线程2需要等待线程1的method1执行完成才能开始执行method2方法。

Method 1 start
Method 1 execute
Method 1 end
Method 2 start
Method 2 execute
Method 2 end

3、静态方法(类)同步

代码段三:

package com.paddx.test.concurrent;public class SynchronizedTest {public static synchronized void method1(){System.out.println("Method 1 start");try {System.out.println("Method 1 execute");Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Method 1 end");}public static synchronized void method2(){System.out.println("Method 2 start");try {System.out.println("Method 2 execute");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Method 2 end");}public static void main(String[] args) {final SynchronizedTest test = new SynchronizedTest();final SynchronizedTest test2 = new SynchronizedTest();new Thread(new Runnable() {@Overridepublic void run() {test.method1();}}).start();new Thread(new Runnable() {@Overridepublic void run() {test2.method2();}}).start();}}

执行结果如下,对静态方法的同步本质上是对类的同步(静态方法本质上是属于类的方法,而不是对象上的方法),所以即使test和test2属于不同的对象,但是它们都属于SynchronizedTest类的实例,所以也只能顺序的执行method1和method2,不能并发执行。

Method 1 start
Method 1 execute
Method 1 end
Method 2 start
Method 2 execute
Method 2 end

4、代码块同步

代码段四:

package com.paddx.test.concurrent;public class SynchronizedTest {public void method1(){System.out.println("Method 1 start");try {synchronized (this) {System.out.println("Method 1 execute");Thread.sleep(3000);}} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Method 1 end");}public void method2(){System.out.println("Method 2 start");try {synchronized (this) {System.out.println("Method 2 execute");Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Method 2 end");}public static void main(String[] args) {final SynchronizedTest test = new SynchronizedTest();new Thread(new Runnable() {@Overridepublic void run() {test.method1();}}).start();new Thread(new Runnable() {@Overridepublic void run() {test.method2();}}).start();}
}

执行结果如下,虽然线程1和线程2都进入了对应的方法开始执行,但是线程2在进入同步块之前,需要等待线程1中同步块执行完成。

Method 1 start
Method 1 execute
Method 2 start
Method 1 end
Method 2 execute
Method 2 end

二、Synchronized 原理:

如果对上面的执行结果还有疑问,也先不用急,我们先来了解Synchronized的原理,再回头上面的问题就一目了然了。我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的:

package com.paddx.test.concurrent;public class SynchronizedDemo {public void method() {synchronized (this) {System.out.println("Method 1 start");}}
}

反编译结果:

在这里插入图片描述
关于这两条指令的作用,我们直接参考JVM规范中描述:

monitorenter :

Each object is associated with a monitor. A monitor is locked if and only if it has an owner. The thread that executes monitorenter attempts to gain ownership of the monitor associated with objectref, as follows:
If the entry count of the monitor associated with objectref is zero, the thread enters the monitor and sets its entry count to one. The thread is then the owner of the monitor.
If the thread already owns the monitor associated with objectref, it reenters the monitor, incrementing its entry count.
If another thread already owns the monitor associated with objectref, the thread blocks until the monitor's entry count is zero, then tries again to gain ownership.

这段话的大概意思为:

每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:

  • 如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者
  • 如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.
  • 如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。

monitorexit:

执行monitorexit的线程必须是objectref所对应的monitor的所有者。

指令执行时,monitor的进入数减1,如果减1后进入数为0,那线程退出monitor,不再是这个monitor的所有者。其他被这个monitor阻塞的线程可以尝试去获取这个 monitor 的所有权。

通过这两段描述,我们应该能很清楚的看出Synchronized的实现原理,Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因

我们再来看一下同步方法的反编译结果:

源代码:

package com.paddx.test.concurrent;public class SynchronizedMethod {public synchronized void method() {System.out.println("Hello World!");}
}

反编译结果:

在这里插入图片描述
从反编译的结果来看,方法的同步并没有通过指令monitorenter和monitorexit来完成(理论上其实也可以通过这两条指令来实现),不过相对于普通方法,其常量池中多了ACC_SYNCHRONIZED标示符。

这里还是要细说一下:

synchronized修饰代码块时的底层实现原理:

public void syncTask(){synchronized (this) {i++;}}

得理解:
同步代码块儿的实现使用的是monitorenter和monitorexit指令,其中,monitorenter指令指向同步代码块的开始位置,monitorexit指令则指明同步代码块儿的结束位置,当执行monitorenter指令时,当前线程将试图获取objectref(即对象锁)所对应的monitor的持有权,当objectref的monitor的进入计数器微0时,那线程可以成功取得monitor,并将计数器的值设置为1,取锁成功。若当前线程已经拥有objectref的monitor的持有权,那它可以重入这个monitor,重入时计数器的值会+1.若其他的线程已经拥有objectref的monitor的所有权,那当前线程将被阻塞,直到正在执行的线程执行完毕,即monitorexit指令被执行,执行当前 线程,将释放monitor并设计计数器值为0,其他线程将有机会持有monitor(必须保证monitorenter和monitorexit成对出现

synchronized修饰方法时的底层实现原理:

public synchronized void synTask() {i++;}

方法级的同步是隐式的,它无需通过字节码指令来控制,它实现方法调用和返回操作之中。JVM可以从方法常量池中的方法表结构(method_info.structure)中的ACC_SYNCHRONIZED访问标志区分一个方法是否同步方法。当方法调用时,调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置。若设置了,执行线程将先持有monnitor,其他任何线程都无法再获得同一个monitor。如果一个同步方法执行期间跑出了异常,并且在方法内部无法处理此异常,那这个同步方法所持有的monitor将异常抛出到同步方法之外自动释放。

重点:
JVM就是根据该标示符来实现方法的同步的:当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,获取成功之后才能执行方法体,方法执行完后再释放monitor

在方法执行期间,其他任何线程都无法再获得同一个monitor对象。其实本质上没有区别,只是方法的同步是一种隐式的方式来实现,无需通过字节码来完成。

三、运行结果解释

有了对Synchronized原理的认识,再来看上面的程序就可以迎刃而解了。

1、代码段2结果:

虽然method1和method2是不同的方法,但是这两个方法都进行了同步,并且是通过同一个对象去调用的,所以调用之前都需要先去竞争同一个对象上的锁(monitor),也就只能互斥的获取到锁,因此,method1和method2只能顺序的执行

2、代码段3结果:

虽然test和test2属于不同对象,但是test和test2属于同一个类的不同实例,由于method1和method2都属于静态同步方法,所以调用的时候需要获取同一个类上monitor(每个类只对应一个class对象),所以也只能顺序的执行。

3、代码段4结果:

对于代码块的同步实质上需要获取Synchronized关键字后面括号中对象的monitor,由于这段代码中括号的内容都是this,而method1和method2又是通过同一的对象去调用的,所以进入同步块之前需要去竞争同一个对象上的锁,因此只能顺序执行同步块。

四 总结:

JVM会自动通过使用monitor来加锁和解锁,保证了同一时刻只有一个线程可以执行指定的代码,从而保证线程安全,同时具有可重入和不可中断的特性。

1、两个线程同时访问一个对象的相同的synchronized方法

同一实例拥有同一把锁,其他线程必然等待,顺序执行

2、两个线程同时访问两个对象的相同的synchronized方法

不同的实例拥有的锁是不同的,所以不影响,并行执行

3、两个线程同时访问两个对象的相同的static的synchronized方法

静态同步方法,是类锁,所有实例是同一把锁,其他线程必然等待,顺序执行

4、两个线程同时访问同一对象的synchronized方法与非synchronized方法

非synchronized方法不受影响,并行执行

5、两个线程访问同一对象的不同的synchronized方法

同一实例拥有同一把锁,所以顺序执行(说明:锁的是this对象==同一把锁)

6、两个线程同时访问同一对象的static的synchronized方法与非static的synchronized方法

static同步方法是类锁,非static是对象锁,原理上是不同的锁,所以不受影响,并行执行

7、方法抛出异常后,会释放锁吗

自动释放锁,这里区别Lock,Lock需要显示的释放锁

3个核心思想:

  • 一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待
  • 每个实例都对应有自己的一把锁,不同的实例之间互不影响;例外:锁对象是*.class以及synchronized被static修饰的时候,所有对象共用同一把锁
  • 无论是方法正常执行完毕还是方法抛出异常,都会释放锁

附上相关的链接:

https://mp.weixin.qq.com/s/wkQUT8Dd0yuJF__bHHNZ0w

https://mp.weixin.qq.com/s/UCfQZ1uELgKgkju1RO5XrQ

感谢并参考:

https://mp.weixin.qq.com/s/1W35xtANDzFlEtHOxBx-Kg

五、关于锁升级:

在JDK的早期,synchronized叫做重量级锁,因为申请锁资源必须通过kernel,系统调用,从用户态 -> 内核态的转换,效率比较低,JDK1.6 之后做了一些优化,为了减少获得锁和释放锁带来的性能开销,引入了偏向锁、轻量级锁的概念。因此大家会发现在 synchronized 中,锁存在四种状态分别是:无锁、偏向锁、轻量级锁、重量级锁;

我们知道synchronized锁的是对象,对象就是Object,Object在heap中的布局,如下图所示

在这里插入图片描述
前面8个字节就是markword,后面4个字节是class pointer就是这个对象属于哪个类的,People就是People.class,Cat类就是Cat.class,在后面实例数据就是看你类里面字段的具体大小了,int age就是4个字节,string name就是英文1个字节, 中文2个字节(String的中文字节数要看用的编码集合,如果是utf-8类型的,那么中文占2到3个字节,如果是GBK类型的,那么中文占2个字节),最后前面三项加起来不能被8整除的,就是补齐到能够被8整除。

下图就是markword(8*8=64位)的分布图,锁升级就是markdown里面标志位的变化。

在这里插入图片描述
网上所以的图都是32位的,我这里画的是64位的,大家发现一共有五种状态,用两位是不够的,所以01的时候在向前借一位。

锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。

1,偏向锁:

在这里插入图片描述
hotspot虚拟机的作者经过调查发现,大部分情况下,加锁的代码不仅仅不存在多线程竞争,而且总是由同一个线程多次获得。所以基于这样一个概率,我们一开始加锁上的是偏向锁,当一个线程访问加了同步锁的代码块时,首先会尝试通过CAS操作在对象头中存储当前线程的ID

  • 如果成功markword则存储当前线程ID,接着执行同步代码块
  • 如果是同一个线程加锁的时候,不需要争用,只需要判断线程指针是否同一个,可直接执行同步代码块
  • 如果有其他线程已经获得了偏向锁,这种情况说明当前锁存在竞争,需要撤销已获得偏向锁的线程,并且把它持有的锁升级为轻量级锁(这个操作需要等到全局安全点,也就是没有线程在执行字节码)才能执行

在我们的应用开发中,绝大部分情况下一定会存在 2 个以上的线程竞争,那么如果开启偏向锁,反而会提升获取锁的资源消耗。所以可以通过jvm参数UseBiasedLocking 来设置开启或关闭偏向锁。偏向锁详细:死磕Synchronized底层实现–偏向锁

2,轻量级锁:

在这里插入图片描述
撤销偏向锁,升级轻量级锁,每个线程在自己的线程栈生成LockRecord,用CAS操作将markword设置为指向自己这个线程的LR的指针,设置成功者得到锁。轻量级锁在加锁过程中,用到了自旋锁,自旋锁的使用,其实也是有一定条件的,如果一个线程执行同步代码块的时间很长,那么这个线程不断的循环反而会消耗 CPU 资源。轻量级详细:死磕Synchronized底层实现–轻量级锁

  • 默认情况下自旋的次数是 10 次,可以通过-XX:PreBlockSpin来修改,或者自旋线程数超过CPU核数的一半
  • 在 JDK1.6之后,引入了自适应自旋锁,自适应意味着自旋的次数不是固定不变的,而是根据前一次在同一个锁上自旋的时间以及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也是很有可能再次成功,进而它将允许自旋等待持续相对更长的时间。如果对于某个锁,自旋很少成功获得过,那在以后尝试获取这个锁时将可能省略掉自旋过程,直接阻塞线程,避免浪费处理器资源

满足这两种情况之一后升级为重量级锁。

3,重量级锁:

我们随便写一段简单的带有 synchronized 关键字的代码。先将其编译为.class 文件,然后使用 javap -c xxx.class 进行反汇编。我们就可以得到 java 代码对应的汇编指令。里面可以找到如下两行指令。

在这里插入图片描述
字节码层面就是关键的这两条指令,monitorenter,moniterexit (注:代码块用的是ACC_SYNCHRONIZED,这是一个标志位,底层原理还是这两条指令)

java中每个对象都关联了一个监视器锁monitor,当monitor被占用时就会处于锁定状态。线程执行monitorenter 指令时尝试获取monitor的所有权,过程如下:

  • 如果monitor的进入数为 0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor 的所有者。
  • 如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加 1。
  • 如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为 0,再重新尝试获取monitor的所有权。

从上面过程可以看出两点,第一:monitor是可重入的,他有计数器,第二:monitor是非公平锁

monitor 依赖操作系统的mutexLock(互斥锁)来实现的,线程被阻塞后便进入内核(Linux)调度状态,这个会导致系统在用户态与内核态之间来回切换,严重影响锁的性能。重量级锁详细:死磕Synchronized底层实现–重量级锁

4,锁消除:

我们都知道 **StringBuffer 是线程安全的,因为它的关键方法都是被 synchronized修饰过的,**但我们看上面这段代码,我们会发现,sb 这个引用只会在 add方法中使用,不可能被其它线程引用(因为是局部变量,栈私有),因此 sb是不可能共享的资源,JVM 会自动消除 StringBuffer 对象内部的锁。

public void add(String str1,String str2){StringBuffer sb = new StringBuffer();sb.append(str1).append(str2);
}

感谢并参考:

https://mp.weixin.qq.com/s/UCfQZ1uELgKgkju1RO5XrQ

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

相关文章

  1. 《EffectiveJava》读后感(第2章创建和销毁对象 第9、10条)

    覆盖equals时总要覆写hashCode 始终要覆盖toString 简单来说这是初学者应当遵守的规则,牢牢记住就对了,并且一般大点的公司在代码提交的时候会通过自动扫描工具进行扫描并解决才能提交。...

    2024/4/16 10:02:11
  2. 08-Python基础-判断语句

    1.判断语句定义如果条件满足,才能做某件事情如果条件不满足,就做另外一件事情 或什么也不做判断语句又称为分支语句 正因为有了判断 才让程序有了很多分支 2.常见判断语句2.1 if语句1. 定义如果条件满足,才能做某件事情如果条件不满足,就做另外一件事情 或什么也不做 判断语…...

    2024/5/5 20:00:10
  3. 区块链各行业应用案例

    区块链 + 金融 案例一:央行区块链数字票据交易平台 中国人民银行推动的基于区块链的数字票据交易平台测试成功,据了解,节后央行旗下的数字货币研究所也将正式挂牌。这意味着,在全球范围内,中国人民银行将成为首个研究数字货币及真实应用的中央银行。 数字货币是电子货币形…...

    2024/4/16 10:01:55
  4. 09设计模式_装饰模式_C语言实现

    装饰模式 1 模拟场景 假设我们需要处理一些数据。 被处理的数据按类型分为内存数据、文件数据。 处理方法包括基本的数据处理功能(如:read、write),还有加密、签名等扩展功能。扩展功能是指可根据场景选择的功能,即:有些场景不需要加密、签名处理,有些场景仅需要加密处理…...

    2024/5/5 19:48:52
  5. 绘制最简单的画布

    绘制最简单的画布 画布的绘制过程全程使用JS代码。 关键代码 getContext(2d): 创建一个CanvasRenderingContext2D对象作为2D渲染的上下文。 moveTo(x, y): 移动画笔,创建一个初始坐标以便后面的绘图。 lineTo(x, y):移动画笔,把画笔移动到当前所指坐标。 stroke(): 开始正式…...

    2024/4/16 10:00:12
  6. Redis 入门指南九:Redis 有序集合(sorted set)

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过…...

    2024/4/18 18:35:13
  7. 企业负面信息如何压制或删除?

    很少跟大家提到网络危机公关这方面的知识,可能很多企业还意识不到它的具体概念,今天,小编就来跟大家说说危机公关是个什么鬼。三鹿毒奶粉曾经就死在了网络危机公关事件里!当然最本质的原因还是归咎为其产品成分违法添加。只是网络危机让它更快的走向了灭亡! 通俗来讲,网络…...

    2024/4/20 10:16:56
  8. Java并发编程实战学习

    极客并发编程实战学习总结并发程序出现的原因并发编程bug的源头java内存模型并发编程需要解决的核心问题分工同步和互斥的万能钥匙--管程互斥锁同步JAVA线程JUC包中常用的并发工具 并发程序出现的原因 1.计算机系统发展过程中,CPU,缓存和硬盘存在一个核心矛盾--三者的速度差异…...

    2024/4/16 10:02:36
  9. 计算机网络复习提纲

    文章目录第1章 概述1-02 试简述分组交换的要点。1-03 试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。1-08 计算机网络都有哪些类别?各种类别的网络都有哪些特点?1-13 客户服务器方式与P2P 对等通信方式的主要区别是什么?有没有相同的地方?1-14 计算机网络有哪…...

    2024/4/20 12:39:15
  10. 【机器学习】机器学习算法分类以及开发流程

    一、机器学习开发流程首先需要明确:(1)算法是核心,数据和计算是基础(2)找准定位大部分复杂模型的算法设计都是算法工程师在做,而我们● 分析很多的数据● 分析具体的业务● 应用常见的算法● 特征工程、调参数、优化我们应该怎么做:1.学会分析问题,使用机器学习算法的…...

    2024/4/19 18:06:52
  11. Java学习(第三阶段模块一)2020/6/10-2020/6/17

    Java学习(第三阶段模块一)任务一:分布式系统1. 分布式系统的发展2. 分布式架构的演变3. 分布式系统面临的问题4. 分布式理论:一致性5. 分布式理论:CAP定理6. 分布式理论:BASE 理论7. 分布式事务8. 分布式理论:一致性协议 2PC9. 分布式理论:一致性协议 3PC10. 分布式理论…...

    2024/4/16 10:01:03
  12. windows与linux中的路径书写,斜杠、反斜杠用法总结

    对于路径中经常出现斜杠“/”和反斜杠“\”,很多人,包括我自己在内,经常会书写错误,尤其是同时在windows和linux两个操作系统中工作时,由于其路径写法的差异,更加剧了这种混淆的发生。这篇文章就系统的整理下斜杠“/”和反斜杠“\”的用法。对于路径中经常出现斜杠“/”和…...

    2024/4/18 7:19:47
  13. 为什么获取不到wiringPi源码

    获取wiringPi源码的方式 从去年开始2019年, wiringPi官网就不提供源码下载了,下面我会说明原因。 wiringPi官网提供了两种获取源码的方法: 即:计划A和计划B,但是我们按照他的操作都会失败,导致很多初学者很纳闷,不知道是哪里出了问题,常常怀疑自己: 是不是网络出了问题…...

    2024/4/16 10:03:05
  14. Homebrew安装及出错Failed to connect to raw.githubusercontent.com port 443: Operation

    Homebrew是Mac系统下非常好用的包管理工具。 1. 安装 官网介绍的安装方式很简单,在terminal当中粘贴 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" 就可以快速安装好homebrew。 但是在国内的网络环境下,使…...

    2024/4/16 10:01:18
  15. 论文翻译——Feature Pyramid Networks for Object Detection

    摘要:特征金字塔是识别系统中用于检测不同尺度目标的基本组成部分。但是最近的深度学习对象检测器避免了金字塔表示,部分原因是它们是计算和内存密集型的。在这篇论文中,我们利用深卷积网路固有的多尺度金字塔层级,以边际额外成本建构特徵金字塔。提出了一种具有横向连接的…...

    2024/4/16 10:01:25
  16. 数据传输对象(DTO)--总结

    DTO产生背景 当我们在设计面向对象接口的时候,好的实践是在一个对象中隐藏很多信息,并提供一组细粒度的方法来访问和操作这些信息,这意味着每个方法都应该负责单个、细粒度的、原子化的功能。这种方法从对象内部提供了很好的抽象,并增加了方法重用的可能性,这样做需要写很…...

    2024/4/16 10:00:53
  17. ziheng -飞机大战5.0

    import random import pygameclass di_ji():def __init__(self,chuangkou):pifu = [r"图片\alien_1.png", r"图片\alien_1.png", r"图片\alien_3.png",r"图片\alien_4.png", r"图片\alien_5.png"]self.x = random.randint(0…...

    2024/4/20 6:21:37
  18. (从电商项目认识数仓体系八)业务数仓理论

    1 表的分类1.1 实体表定义:一般指一个现实存在的业务对象,比如用户,商品,商家,销售员等等例:用户表用户id姓名生日性别邮箱用户等级创建时间1张三2011-11-11男zs@163.com22018-11-112李四2011-11-11女ls@163.com32018-11-113王五2011-11-11男ww@163.com12018-11-11......…...

    2024/4/16 10:02:19
  19. 电商项目-分布式基础

    电商项目-分布式基础-记得数据库用shell脚本备份 一、分布式基础概念 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVJc869B-1593953567909)(C:\Users\19473\AppData\Roaming\Typora\typora-user-images\1591718756922.png)] [外链图片转存失败,源…...

    2024/3/28 19:01:04
  20. # Java 流程控制- # 结构(if,Switch)- 循环(while,do...while,for)

    Java 流程控制- 结构(if,Switch) 循环(while,do…while,for) 1. 顺序结构 java的基本结构就是顺序结构,除非特别指明,否则按照从上往下,一句一句执行。它是任何一个算法都离不开的一种基本算法结构。* 2. 选择结构 1. if 单选择结构: int a = 10;// 声明 并 创建一个…...

    2024/4/16 10:01:47

最新文章

  1. leetcode40-Combination Sum II

    题目 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,…...

    2024/5/6 0:03:16
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. 前端 js 经典:字符编码详解

    前言:计算机只能识别二进制,开发语言中数据类型还有数字,字母,中文,特殊符号等,都需要转化成二进制编码才能让技术机识别。 一. 编码方式 ACSLL、Unicode、utf-8、URL 编码、base64 等。 1. ACSLL 对英语…...

    2024/5/4 10:30:35
  4. 【嵌入式开发 Linux 常用命令系列 4.3 -- git add 不 add untracked file】

    请阅读【嵌入式开发学习必备专栏 】 文章目录 git add 不add untracked file git add 不add untracked file 如果你想要Git在执行git add .时不添加未跟踪的文件(untracked files),你可以使用以下命令: git add -u这个命令只会加…...

    2024/5/5 8:53:25
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

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

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

    2024/5/4 23:55:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

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

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

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

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

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

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

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

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

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

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

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

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

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

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

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

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

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

    %读入6幅图像(每一幅图像的大小是564*564) 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系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 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系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...

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

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

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

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

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

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

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

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

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

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

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

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