1.hashmap是安全的吗?
不安全
为什么?
hashmap底层是一个Entry数组,当发生hash冲突的时候是采用链表的方式解决的,
在对应的数组位置存放链表的头结点,新加的结点会从头结点加入,但是此实现
不是同步的,当多个线程刚好对同一个数组位置同时进行addEntry操作,它们会
同时获得头结点,当其中一个进行头结点插入时后面的会覆盖掉其数据,导致数
据丢失。
怎么变成线程安全
自己实现同步,Map map = Collections.synchronizedMap(new HashMap(...));
2.乐观锁和悲观锁
乐观锁:总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线
程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没
有对数据进行修改,一般会使用版本号机制。
悲观锁:每次取数据时都认为其他线程会修改,所以都会加锁,当其他线程想要
访问数据时,都需要阻塞挂起。
3.synchronized和Lock区别
synchronized:关键字,如果一个代码块被synchronized修饰了,当一个线程获
取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线
程释放锁。
Lock:是一个类,Lock必须要用户去手动释放锁,如果没有主动释放锁,就有可
能导致出现死锁现象。有tryLock()方法,可在里面设置等待时间。