0%

什么是事务

  • 事务是一组逻辑上的操作,要么都执行,要么都不执行
  • 事务能否生效需要数据库引擎的支持,比如常用的 MySQL 数据库默认使用支持事务的innodb引擎。但是,如果把数据库引擎变为 myisam,那么程序也就不再支持事务了。

事务的ACID特性

阅读全文 »

JDK7中concorrentHashMap源码解析

1、数据结构

Java 7 中 ConcurrentHashMap 的存储结构如上图,ConcurrnetHashMap 由很多个 Segment 组合,而每一个 Segment 是一个类似于 HashMap 的结构,所以每一个 HashMap 的内部可以进行扩容。但是 Segment 的个数一旦初始化就不能改变,默认 Segment 的个数是 16 个,你也可以认为 ConcurrentHashMap 默认支持最多 16 个线程并发。

阅读全文 »

JDK8中hashMap源码解析

1、hashMap数据结构

因为主要说的是1.8版本中的实现。而1.8中HashMap是数组+链表+红黑树实现的,大概如下图所示。后面还是主要介绍Hash Map中主要的一些成员以及方法原理。

阅读全文 »

JDK7中hashMap源码解析

1、hashMap数据结构

hashMap底层数据结构是数组 + 单链表,对 key 计算 hashCode 散列到数组中, 相同的 hashCode 的 key 添加到同一个链表中。

阅读全文 »

JDK提供的

  • ConcurrentHashMap: 线程安全的 HashMap
  • CopyOnWriteArrayList: 线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector.
  • ConcurrentLinkedQueue: 高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。
  • BlockingQueue: 这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。
  • ConcurrentSkipListMap: 跳表的实现。这是一个 Map,使用跳表的数据结构进行快速查找。

ConcurrentHashMap

阅读全文 »

Atomic原子类

  • Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。

JUC 包中的原子类是哪4类?

阅读全文 »

yield + 自旋实现同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class YieldLock {
/**
* 自旋锁实现:使用AtomicReference
* - AtomicReference原子性,底层实现CAS操作,可以对比普通对象的引用。
* - 使用unsafe.compareAndSwapObject来完成,支持普通对象的CAS操作。
*/
AtomicReference<Thread> lock = new AtomicReference<>();

public void lock1() {
Thread t = Thread.currentThread();
while (!lock.compareAndSet(null, t)) {
t.yield();
System.out.println(t.getName() + "***************** 尝试获取锁失败");
}
System.out.println(t.getName() + "***************** 获取锁");
}

public void unLock() {
Thread t = Thread.currentThread();
System.out.println(t.getName() + "***************** 释放锁");
lock.compareAndSet(t, null);
}
}

sleep + 自旋方式实现同步

阅读全文 »

内存泄漏

  • 内存泄漏是堆内存中不再使用的对象,但是垃圾收集器没有将它们删除的情况,因此它们将会被不必要的一直存在。这样会消耗内存资源,降低系统性能,最终可能导致OOM发生。

Java中内存泄漏的类型

阅读全文 »