0%

ConcurrentLinkedQueue

ConcurrentLinkedQueue是一种适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,由于ConcurrentLinkedQueue是一种非阻塞的队列,通常ConcurrentLinkedQueue性能好于BlockingQueue。是一种基于链表节点的无界线程安全队列。该队列的元素遵循先进先出FIFO的原则,该队列不允许为null

阅读全文 »

CopyOnWrite容器

什么是CopyOnWrite容器呢?CopyOnWrite容器是一个写时复制的容器。在向容器中添加元素时,不会直接向当前容器中添加,而是将当前容器进行copy,复制出一个新的容器,然后往新的容器中添加元素,添加完元素之后,再将容器的引用指向新的容器。使得我们可以对CopyOnWrite容器进行并发的读而不需要加锁,采用了读写分离的思想,写时复制的策略

使用的场景是读多写少的时候使用,如redis、Linux的文件管理系统等

基本思路

  • 当读取共享数据时,直接读取,不需要有其他操作
  • 当写共享数据时,将旧数据复制出来一份作为新数据,只修改新数据,修改完新数据后将新数据的引用赋值给原来数据的引用,在写数据的过程中,所有读取共享数据都是读的旧数据
阅读全文 »

JOptimizer解决LP问题

可以使用JOptimizer来解决LP问题

1
2
3
4
5
<dependency>
<groupId>com.joptimizer</groupId>
<artifactId>joptimizer</artifactId>
<version>5.0.0</version>
</dependency>

解决问题

1
2
3
4
5
6
/** minimize 4x+3Y 
* Subject to
* 8x+6y <= 25
* 3x+4y >= 15
* x,y >= 0
*/

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
LinearMultivariateRealFunction objectiveFunction = new LinearMultivariateRealFunction(new double[]{4.0, 3.0}, 0); //minimize 4x+3y

ConvexMultivariateRealFunction[] inequalities = new ConvexMultivariateRealFunction[4];

// 不等式中都以G.x < h的形式出现
// x >= 0
inequalities[0] = new LinearMultivariateRealFunction(new double[]{-1.0, 0.00}, 0.0);
// y >= 0
inequalities[1] = new LinearMultivariateRealFunction(new double[]{0.0, -1.00}, 0.0);
// 8x+6y <= 25
inequalities[2] = new LinearMultivariateRealFunction(new double[]{8, 6}, -25);
// 3x+4y >= 15
inequalities[3] = new LinearMultivariateRealFunction(new double[]{-3, -4}, 15);

OptimizationRequest or = new OptimizationRequest();
or.setF0(objectiveFunction);
or.setFi(inequalities);
// or.setToleranceFeas(JOptimizer.DEFAULT_FEASIBILITY_TOLERANCE/10);
// or.setTolerance(JOptimizer.DEFAULT_TOLERANCE/10);
// or.setMaxIteration(2000);

//optimization
JOptimizer opt = new JOptimizer();
opt.setOptimizationRequest(or);

try {
opt.optimize();
} catch (Exception e) {
e.printStackTrace();
}

if (opt.getOptimizationResponse() != null) {
double[] sol = opt.getOptimizationResponse().getSolution();

for (int i = 0; i < sol.length / 2; i++) {
System.out.println("x" + (i + 1) + ": " + Math.round(sol[i]) + "\ty" + (i + 1) + ": " + Math.round(sol[i + 1]));
}
}

结果为

1
x1: 0    y1: 4

TreeMap详解

TreeMap是Map接口的一个实现类,底层基于红黑树的实现,按照key的顺序存储

阅读全文 »

HashMap详解

介绍

HashMap是在项目中使用的最多的Map,实现了Map接口,继承AbstractMap。基于哈希表的Map接口实现,不包含重复的键,一个键对应一个值,在HashMap存储的时候会将key、value作为一个整体Entry进行存储。

HashMap中会根据hash算法来计算key所对应的存储位置。

阅读全文 »