主要考察的是锁的四种状态和互斥锁跟自旋锁的区别
锁的四种状态
自旋锁和互斥锁的特点:①自旋锁与互斥锁都是为了实现保护资源共享的机制。
②无论是自旋锁还是互斥锁,在任意时刻,都最多只能有一个保持者。
③获取互斥锁的线程,如果锁已经被占用,则该线程将进入睡眠状态;获取自旋锁的线程则不会睡眠,而是一直循环等待锁释放
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代【标记-复制算法】)+Parallel Old(老年代【标记整理算法】)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1【从局部(两个Region之间)来看是基于"标记—复制"算法实现,从整体来看是基于"标记-整理"算法实现】
详细的关于GC的介绍可以读这篇简介文章
主要是考察MyISAM和InnoDB,有一点可能会被忽略的InnoDB特性就是,它并不保存表的具体行数,可以看这篇文章
ping ip地址 具体文章
那么在这一过程中用到了什么协议呢?
- 首先要明白ping是基于ICMP这个协议的,然后通过DNS协议,将ping后接的域名转换为ip地址。(DNS使用的传输层协议是UDP)
- 通过ARP解析服务,由ip地址解析出MAC地址,以在数据链路层传输。
- ping是为了测试另一台主机是否可达,发送一份ICMP回显请求给目标主机,并等待ICMP回显应答。(ICMP用于在ip主机、路由器间传递网络是否通畅、主机是否可达等控制信息)
- Spring 框架的
IOC
基于反射创建对象和设置依赖属性。Spring MVC
的请求调用对应方法,也是通过反射。JDBC
的Class#forName(String className)
方法,也是使用反射。
主要关注点放在它是基于ICMP协议上即可 具体文章
这篇文章觉得不错,总结的很到位,而且没有废话。补充一点,synchronized锁是可以设置超时时间的,利用wait()和notify()
要明白,泛型类是在实例化类的时候指明泛型的具体类型;泛型方法是在调用方法的时候指明泛型的具体类型。但是实现泛型接口的类时,并不一定要传入泛型实参;静态方法不可以访问类上定义的泛型,因为静态方法又称为类方法,在类初始化时就要确定下来的,而这时候泛型可能都没确定下来。
这篇文章不错
guide哥介绍序列化的这篇文章挺不错的
但是如何维护序列化没有谈到,补充四点:
- 只修改了类的方法,无需改变serialVersionUID
- 只修改了类的static变量和使用transient 修饰的实例变量,无需改变serialVersionUID
- 如果修改了实例变量的类型,例如一个变量原来是int改成了String,则反序列化会失败,需要修改serialVersionUID;
- 如果删除了类的一些实例变量,可以兼容无需修改;如果给类增加了一些实例变量,可以兼容无需修改,只是反序列化后这些多出来的变量的值都是默认值。
- 如果某个类的成员变量的类型不是基本类型,而是一个引用类型,那么这个引用类必须是可序列化的,否则拥有该类型成员变量的类也是不可序列化的。
主要是第三点,如果修改了实例变量的类型就要修改版本号好了。
要明白yield方法的作用是提出释放CPU时间片的请求。不会释放锁,线程依然处于RUNNABLE状态,所以该线程并不需要等待其他线程的唤醒
同时synchronized和volatile均可以保证可见性,但是volatile保证不了原子性,而synchronized可以
volatile和synchronized是多线程最常考的东西,可以看我的这篇文章
双亲委派机制是JVM中的重点,guide哥写的这篇文章挺好的,有兴趣看下