2021-4-17
一。8锁
1.synchronized如果修饰普通方法,锁的是方法的调用者;如果修饰静态方法,锁的是方法方法所在类的class实例
2.普通方法不会被synchronized方法影响,独立执行。
二。线程安全的集合
在多线程环境下,arraylist、set都是线程不安全的,解决办法:
1.使用Collections工具类的Synchronizedxxx方法,可以把线程不安全的集合转换为线程安全的集合返回
2.使用原生安全的集合,如vector、hashtable
3.使用juc包的CopyOnWriteArrayList、concurrenthashmap等并发安全集合
CopyOnWriteArrayList
1.出现更早的vector是将方法用synchronized修饰来保证并发安全,而CopyOnWriteArrayList使用了juc包中的lock锁,效率就比synchronized关键字高。所以同为并发安全的集合,建议使用CopyOnWriteArrayList
2. CopyOnWriteArrayList采用了复制再写入的方法。在尝试插入数据时,调用array.copyof方法复制原数组,将数据插入到复制出来的新数组中,然后内部引用就会指向新数组,原数组被回收。
3.多线程环境下,该集合的写操作(插入,删除,设置–修改)都会使用lock锁保证线程安全,读操作则不会使用锁。
4. 线程并发读数组有以下几种情况:
1)如果写操作未完成,那么直接读取原数组的数据;
2)如果写操作完成,但是引用还未指向新数组,那么也是读取原数组数据;
3)如果写操作完成,并且引用已经指向了新的数组,那么直接从新数组中读取数据。
5.由于所有的写操作都需要创造新的数组,并且包含大量的数组元素复制操作,所以 CopyOnWriteArrayList 适合读多写少的操作。在数据量大时,尽量避免使用 CopyOnWriteArrayList 作为容器。
CopyOnWriteArraySet
与CopyOnWriteArrayList的机制类似
ConcurrentHashmap
1.7使用segement分段锁,1.8使用unsafe类的cas操作+synchronized锁住索引上链表的头节点保证插入时线程安全。