java查缺补漏之第十五天(又开始查缺补漏了,加油!)
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底层是怎么实现的?
对下面的代码进行反编译
public class SynchronizedDemo {
public void method() {
synchronized (this) {
System.out.println("Method 1 start");
}
}
}
关于这两条指令的作用:
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对象
还没有评论,来说两句吧...