https://blog.csdn.net/vking_wang/article/details/14166593
synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块
https://www.cnblogs.com/jiansen/p/7351872.html
https://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。
https://www.cnblogs.com/dolphin0520/p/3920373.html
Lock 和 Synchronized 的区别
ReentrantLock
ReentrantLock是唯一实现了Lock接口的类,并且ReentrantLock提供了更多的方法。
公平锁即尽量以请求锁的顺序来获取锁。比如同是有多个线程在等待一个锁,当这个锁被释放时,等待时间最久的线程(最先请求的线程)会获得该所,这种就是公平锁。
非公平锁即无法保证锁的获取是按照请求锁的顺序进行的。这样就可能导致某个或者一些线程永远获取不到锁。
在Java中,synchronized就是非公平锁,它无法保证等待的线程获取锁的顺序。而对于ReentrantLock和ReentrantReadWriteLock,它默认情况下是非公平锁,但是可以设置为公平锁。
https://www.cnblogs.com/dolphin0520/p/3923167.html
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。
添加索引的话,首先去索引列表中查询,而我们的索引列表是B类树的数据结构,查询的时间复杂度为O(log2N),定位到特定值得行就会非常快,所以其查询速度就会非常快。
进程时操作系统分配资源的最小单位,线程是处理器任务调度和执行的最小单位。线程是进程的一部分,一个进程可以有多个线程。同一进程中的线程共享地址空间和资源,而不同进程之间的地址空间和计算资源是相互独立的。
当我们在浏览器中输入 www.baidu.com ,然后回车,到底发生了什么
过程
HTTP1.0,发送一次请求需要等待服务器响应了才可以继续发送请求
HTTP1.1,持久连接;提出Pipeline理论,不用等待服务器响应就可以发送请求,但是回送数据给客户端的时候,客户端还是要按照响应的顺序一一接受
HTTP2与HTTP1.1最重要的区别就是解决了线头阻塞问题——多路复用
1. 相等(相同)的对象必须有相等的Hash
2. 如果两个对象的HashCode相同,它们并不一定相同
Java集合中比较两个对象是否相同是首先比较两个值的HashCode是否相等,如果不等则两个对象不等;如果相等则用equals进行比较。
Java中的异常指的是在程序运行时发生的错误,Java中通过API中的Throwable类中的众多子类来描述异常。
Java异常机制:
方法区:存放加载类的信息,常量,静态变量
堆:存放几乎所有的Java对象
虚拟机栈:每个方法执行时都会创建一个栈帧,用于存在局部变量、方法出口信息、操作栈等
本地方法栈:与虚拟机栈相似,为本地native方法所用
程序计数器:当前线程所执行的字节码的行号指示器。
双亲委派机制的工作过程:
如果一个类加载器收到类加载的请求时,它首先不会自己取尝试加载这个类,而是把这个请求委派给父类加载器完成,每一个层次的加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈给自己无法完成加载请求的时候,子加载器才会尝试自己完成加载。
使用双亲委派机制来组织类加载器之间的关系,一个显而易见的好处就是Java中的类随着它的类加载器一起具备了一种带有优先级的层次关系。
Volatile是一个轻量级的同步机制,它的主要特性:
1. 保证共享变量的对所有线程的可见性
2.禁止指令重排序优化
新生代(Eden)、老年代
Minor GC 、 Major GC 、Full GC
https://blog.csdn.net/a724888/article/details/81114916
强引用:
软引用:
弱引用:
虚引用:
锁的四种状态:
类加载检查–>分配内存–>初始化零值–>设置对象头–>执行init方法
24
Synchronized 是Java 关键字,由Java编译器实现锁的功能;而ReentrantLock是java.util.concurrent包下的一套互斥锁,需要lock()、unlock()配合try/catch/finally使用。
ReentrantLock 相比于Synchronized提供了一些高级功能:
1 . 等待可中断:持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,从而可以避免死锁的出现。
2. 公平锁:ReentrantLock 是公平锁,即 多个线程等待同一个锁的时候,必须按照申请时间顺序获得锁,可通过参数调节是否为公平锁;而Synchronized 是非公平锁。
3. 锁绑定多个条件:ReentrantLock可以同时绑定多个对象,用来实现分组唤醒需要唤醒的线程,Synchronized 要么随机唤醒一个线程,要么唤醒全部线程。