java查缺补漏之第十五天(又开始查缺补漏了,加油!)

Love The Way You Lie 2023-07-13 13:57 109阅读 0赞

1.http和https区别 ,ssl层作用 证书有什么用 ?

区别主要就是https再传输层和应用层之间,加了一个SSL,安全套接层协议。

作用是数据通信提供安全支持。

证书的作用是防止流量劫持,防止钓鱼网站。

2.Synchronized加到不同地方有什么作用?

修饰方法和代码块:Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来的范围,而修饰方法范围是整个函数。(但实际上synchronized锁住的是this这个对象)

修饰静态方法和类:静态方法是属于类的而不属于对象的。同样的,synchronized修饰的静态方法锁定的是这个类的所有对象。

3.Synchronized是不是可重入锁?

首先说一下什么是可重入锁:通俗来说,当线程请求一个由其它线程持有的对象锁时,该线程会阻塞,而当线程请求由自己持有的对象锁时,如果该锁是重入锁,请求就会成功,否则阻塞。

Synchronized是可重入锁。

重入锁实现可重入性原理或机制是:每一个锁关联一个线程持有者和计数器,当计数器为 0 时表示该锁没有被任何线程持有,那么任何线程都可能获得该锁而调用相应的方法;当某一线程请求成功后,JVM会记下锁的持有线程,并且将计数器置为 1;此时其它线程请求该锁,则必须等待;而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增;当线程退出同步代码块时,计数器会递减,如果计数器为 0,则释放该锁。

4.volatile不保证原子性是为啥?

它保证可见性和有序性,不保证原子性主要和内存屏障有关。内存屏障是一个保证有序的指令,保证在它之前的指令执行完才执行在它之后的指令。

简单的说,修改volatile变量分为四步:

1)读取volatile变量到local

2)修改变量值

3)local值写回

4)插入内存屏障,即lock指令,让其他线程可见

这样就很容易看出来,前三步都是不安全的,取值和写回之间,不能保证没有其他线程修改。原子性需要锁来保证。

5.synchronized底层是怎么实现的?

对下面的代码进行反编译

  1. public class SynchronizedDemo {
  2. public void method() {
  3. synchronized (this) {
  4. System.out.println("Method 1 start");
  5. }
  6. }
  7. }

这里写图片描述

关于这两条指令的作用:
monitorenter:
每个对象都有一个监视器锁(monitor),当monitor被占用时就会处于锁定状态。线程执行monitorenter命令获取monitor锁的过程如下:
1、如果monitor的进入数为0,则线程获取锁,并设置monitor的进入数为1
2、如果该线程已经占有该monitor,则进入数+1
3、如果其他线程占有该monitor,则monitor的进入数不为0,则该线程进入阻塞状态,直到monitor为0,重新获取monitor的所有权

monitorexit:
执行monitorexit的线程必须是monitor的所有者。
当执行该命令时,monitor的进入数-1,当monitor的进入数为0,该线程已经不再是该monitor的所有者,其他被这个monitor阻塞的线程可以尝试获取monitor的所有权。

6. synchronzied锁住的是对象还是代码块?

参考:https://blog.csdn.net/xiao__gui/article/details/8188833?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

synchronized锁住的是括号里的对象,而不是代码。对于非static的synchronized方法,锁的就是对象本身也就是this。

static synchronized方法,static方法可以直接类名加方法名调用,方法中无法使用this,所以它锁的不是this,而是类的Class对象

发表评论

表情:
评论列表 (有 0 条评论,109人围观)

还没有评论,来说两句吧...

相关阅读

    相关 TechBits | HTTP

    前言 对于 HTTP 协议的了解,一直停留在它是一种通信协议,用于帮助客户端和服务端之间的传送多种类型的数据,并在客户端上进行展示。但是对于其中有些字段倒是没有过多理解,

    相关 java

    最近有个需求要把项目发布在weblogic12c服务器中,按照网上的教程对springboot项目进行改造后,陆续遇到了几个问题: 1.weblogic报错:afu.com