【笔记】Java高并发

前言

Java高并发学习笔记

BlockingQueue阻塞队列

  • 队列的使用场景:将数据存入队列,可以启动缓冲作用。消峰流量
  • 阻塞队列实现了生产者和消费者之间的解耦

创建一个阻塞队列

ArrayBlockingQueue链表阻塞队列

<length>:队列长度

1
BlockingQueue blockingQueue = new ArrayBlockingQueue<>(<length>);

LinkedBlockingQueue链表阻塞队列

  • 不指定长度默认是无界的,默认大小是Integer.MaxValue
1
2
BlockingQueue blockingQueue = new LinkedBlockingQueue<>();
BlockingQueue blockingQueue = new LinkedBlockingQueue<>(<length>);

向阻塞队列插入数据

add()方法

  • 当队列满时,会抛异常
1
blockingQueue.put(<item>);

put()方法

  • 当队列满时,不会抛异常,会产生阻塞

<item>:插入的元素

1
blockingQueue.put(<item>);

offer()方法

  • 当队列已满,会返回false;当队列未满,会返回true
1
blockingQueue.offer(<item>);
重载方法
  • 当队列已满或产生超时时,会产生阻塞

<timeout>:超时时间,单位毫秒

1
blockingQueue.offer(<item>, <timeout>, TimeUnit.SECONDS);

向阻塞队列删除数据

remove()方法

  • 当队列为空时,会抛异常
1
blockingQueue.remove();

take

  • 当队列为空时,不会抛异常,会产生阻塞
1
blockingQueue.take();

poll()方法

  • 当队列为空时,会返回null
1
blockingQueue.poll();
重载方法
  • 当队列为空或产生超时时,会产生阻塞
1
blockingQueue.poll(<timeout>, TimeUnit.SECONDS);

具有优先级的阻塞队列

创建一个实现了Comparable接口的JavaBean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class User implements Comparable<User> {

// 定义一个优先级属性
private int priority;

@override
public int compareTo(User user) {
// 按照降序排序
return user.priority-this.priority;
}

public User(int priority) {
this.priority = priority;
}
}

创建一个具有优先级的阻塞队列

1
BlockingQueue<User> blockingQueue = new PriorityBlockingQueue<>();

将具有比较方法的对象存入队列

<priority>:优先级

1
blockingQueue.add(new User(<priority>));

ConcurrentMap高并发的Map

创建一个ConcurrentMap

  • 并发安全的,引入了分段锁机制(1.8及之前版本)
  • 引入了无锁机制(1.8之后版本)
  • 底层分了16段(segment),每个段可以看做是一个HashTable,理论上并发性能要比HashMap高16倍
1
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();

完成