Java

1.hashmap是安全的吗?

不安全

为什么?

hashmap底层是一个Entry数组,当发生hash冲突的时候是采用链表的方式解决的,
在对应的数组位置存放链表的头结点,新加的结点会从头结点加入,但是此实现
不是同步的,当多个线程刚好对同一个数组位置同时进行addEntry操作,它们会
同时获得头结点,当其中一个进行头结点插入时后面的会覆盖掉其数据,导致数
据丢失。

怎么变成线程安全

自己实现同步,Map map = Collections.synchronizedMap(new HashMap(...));

2.乐观锁和悲观锁

乐观锁:总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线
程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没
有对数据进行修改,一般会使用版本号机制。
悲观锁:每次取数据时都认为其他线程会修改,所以都会加锁,当其他线程想要
访问数据时,都需要阻塞挂起。

3.synchronized和Lock区别

synchronized:关键字,如果一个代码块被synchronized修饰了,当一个线程获
取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线
程释放锁。
Lock:是一个类,Lock必须要用户去手动释放锁,如果没有主动释放锁,就有可
能导致出现死锁现象。有tryLock()方法,可在里面设置等待时间。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值