Skip to content

Commit 436102c

Browse files
committed
update 0303
1 parent 46835e7 commit 436102c

File tree

9 files changed

+432
-0
lines changed

9 files changed

+432
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package java0.conc0303.collection;
2+
3+
import java.util.Map;
4+
import java.util.concurrent.ConcurrentHashMap;
5+
import java.util.concurrent.CountDownLatch;
6+
import java.util.concurrent.atomic.AtomicInteger;
7+
8+
public class ConcurrentHashMapDemo {
9+
10+
public static void main(String[] args) {
11+
demo1();
12+
}
13+
14+
public static void demo1() {
15+
final Map<String, AtomicInteger> count = new ConcurrentHashMap<>();
16+
final CountDownLatch endLatch = new CountDownLatch(2);
17+
Runnable task = new Runnable() {
18+
@Override
19+
public void run() {
20+
AtomicInteger oldValue;
21+
for (int i = 0; i < 5; i++) {
22+
oldValue = count.get("a");
23+
if (null == oldValue) {
24+
AtomicInteger zeroValue = new AtomicInteger(0);
25+
oldValue = count.putIfAbsent("a", zeroValue);
26+
if (null == oldValue) {
27+
oldValue = zeroValue;
28+
}
29+
}
30+
oldValue.incrementAndGet();
31+
}
32+
endLatch.countDown();
33+
}
34+
};
35+
new Thread(task).start();
36+
new Thread(task).start();
37+
38+
try {
39+
endLatch.await();
40+
System.out.println(count);
41+
} catch (Exception e) {
42+
e.printStackTrace();
43+
}
44+
}
45+
46+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package java0.conc0303.collection;
2+
3+
import java.util.ArrayList;
4+
import java.util.LinkedList;
5+
import java.util.List;
6+
import java.util.Vector;
7+
import java.util.concurrent.CopyOnWriteArrayList;
8+
9+
public class CopyOnWriteArrayListDemo {
10+
11+
public static void main(String[] args) {
12+
13+
// ArrayList,LinkedList,Vector不安全,运行报错
14+
// why Vector 也不安全
15+
// List<Integer> list = new ArrayList<Integer>();
16+
// List<Integer> list = new LinkedList<>();
17+
// List<Integer> list = new Vector<>();
18+
19+
// 只有CopyOnWriteArrayList 安全,不报错
20+
List<Integer> list = new CopyOnWriteArrayList();
21+
22+
for (int i = 0; i < 10000; i++)
23+
{
24+
list.add(i);
25+
}
26+
27+
T1 t1 = new T1(list);
28+
T2 t2 = new T2(list);
29+
t1.start();
30+
t2.start();
31+
32+
}
33+
34+
public static class T1 extends Thread
35+
{
36+
private List<Integer> list;
37+
38+
public T1(List<Integer> list)
39+
{
40+
this.list = list;
41+
}
42+
43+
public void run()
44+
{
45+
for (Integer i : list)
46+
{
47+
}
48+
}
49+
}
50+
51+
public static class T2 extends Thread
52+
{
53+
private List<Integer> list;
54+
55+
public T2(List<Integer> list)
56+
{
57+
this.list = list;
58+
}
59+
60+
public void run()
61+
{
62+
for (int i = 0; i < list.size(); i++)
63+
{
64+
list.remove(i);
65+
}
66+
}
67+
}
68+
69+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package java0.conc0303.collection;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.concurrent.CopyOnWriteArrayList;
6+
import java.util.concurrent.ExecutorService;
7+
import java.util.concurrent.Executors;
8+
9+
10+
public class CopyOnWriteArrayListDemo1 {
11+
private static final int THREAD_POOL_MAX_NUM = 10;
12+
//private List<String> mList = new ArrayList<String>(); // ArrayList 无法运行
13+
private List<String> mList = new CopyOnWriteArrayList<>();
14+
15+
public static void main(String args[]) {
16+
new CopyOnWriteArrayListDemo1().start();
17+
}
18+
19+
private void initData() {
20+
for (int i = 0; i <= THREAD_POOL_MAX_NUM; i++) {
21+
this.mList.add("...... Line " + (i + 1) + " ......");
22+
}
23+
}
24+
25+
private void start() {
26+
initData();
27+
ExecutorService service = Executors.newFixedThreadPool(THREAD_POOL_MAX_NUM);
28+
for (int i = 0; i < THREAD_POOL_MAX_NUM; i++) {
29+
service.execute(new ListReader(this.mList));
30+
service.execute(new ListWriter(this.mList, i));
31+
}
32+
service.shutdown();
33+
}
34+
35+
private class ListReader implements Runnable {
36+
private List<String> mList;
37+
38+
public ListReader(List<String> list) {
39+
this.mList = list;
40+
}
41+
42+
@Override
43+
public void run() {
44+
if (this.mList != null) {
45+
for (String str : this.mList) {
46+
System.out.println(Thread.currentThread().getName() + " : " + str);
47+
}
48+
}
49+
}
50+
}
51+
52+
private class ListWriter implements Runnable {
53+
private List<String> mList;
54+
private int mIndex;
55+
56+
public ListWriter(List<String> list, int index) {
57+
this.mList = list;
58+
this.mIndex = index;
59+
}
60+
61+
@Override
62+
public void run() {
63+
if (this.mList != null) {
64+
//this.mList.remove(this.mIndex);
65+
this.mList.add("...... add " + mIndex + " ......");
66+
}
67+
}
68+
}
69+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package java0.conc0303.collection;
2+
3+
import java.util.concurrent.CopyOnWriteArrayList;
4+
5+
public class CopyOnWriteArrayListDemo2 {
6+
7+
private final static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList();
8+
9+
public static void main(String[] args) {
10+
// 这个例子再次证明,
11+
// 多个步骤的操作,不能保证原子性
12+
// list.size() 获取到的数,再继续用list时,可能已经变了
13+
//
14+
test();
15+
}
16+
public static void test(){
17+
for(int i = 0; i<10000; i++){
18+
list.add("string" + i);
19+
}
20+
21+
new Thread(new Runnable() {
22+
@Override
23+
public void run() {
24+
while (true) {
25+
if (list.size() > 0) { // todo : 下一个get操作执行时,size可能已经是0了
26+
String content = list.get(list.size() - 1);
27+
}else {
28+
break;
29+
}
30+
}
31+
}
32+
}).start();
33+
34+
new Thread(new Runnable() {
35+
@Override
36+
public void run() {
37+
while (true) {
38+
if(list.size() <= 0){
39+
break;
40+
}
41+
list.remove(0);
42+
try {
43+
Thread.sleep(10);
44+
} catch (InterruptedException e) {
45+
e.printStackTrace();
46+
}
47+
}
48+
}
49+
}).start();
50+
}
51+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package java0.conc0303.collection;
2+
3+
import java.util.HashMap;
4+
import java.util.Iterator;
5+
import java.util.LinkedHashMap;
6+
import java.util.Map;
7+
import java.util.Set;
8+
9+
public class LinkedHashMapDemo {
10+
public static void main(String[] args) {
11+
12+
// test hash map
13+
System.out.println("=====>1. test hash map");
14+
Map<String, String> hashMap = new HashMap<String, String>();
15+
hashMap.put("name1", "josan1");
16+
hashMap.put("name2", "josan2");
17+
hashMap.put("name3", "josan3");
18+
Set<Map.Entry<String, String>> set = hashMap.entrySet();
19+
Iterator<Map.Entry<String, String>> iterator = set.iterator();
20+
while(iterator.hasNext()) {
21+
Map.Entry entry = iterator.next();
22+
String key = (String) entry.getKey();
23+
String value = (String) entry.getValue();
24+
System.out.println("key:" + key + ",value:" + value);
25+
}
26+
27+
// test linked hash map
28+
System.out.println("=====>2. test linked hash map");
29+
Map<String, String> linkedHashMap = new LinkedHashMap<>();
30+
linkedHashMap.put("name1", "josan1");
31+
linkedHashMap.put("name2", "josan2");
32+
linkedHashMap.put("name3", "josan3");
33+
Set<Map.Entry<String, String>> set1 = linkedHashMap.entrySet();
34+
Iterator<Map.Entry<String, String>> iterator1 = set1.iterator();
35+
while(iterator1.hasNext()) {
36+
Map.Entry entry = iterator1.next();
37+
String key = (String) entry.getKey();
38+
String value = (String) entry.getValue();
39+
System.out.println("key:" + key + ",value:" + value);
40+
}
41+
42+
}
43+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package java0.conc0303.collection;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collections;
6+
import java.util.List;
7+
8+
public class SyncListDemo {
9+
10+
public static void main(String[] args) {
11+
List list0 = Arrays.asList(1,2,3,4,5,6,7,8,8);
12+
list0.set(8,9); // 可以修改内容,不能变动元素数量
13+
// list0.add(10) will throw an error
14+
15+
List list = new ArrayList(); // 正常List,可以操作
16+
list.addAll(list0);
17+
18+
List list1 = Collections.synchronizedList(list);
19+
20+
// 多线程操作
21+
// to do something
22+
23+
System.out.println(Arrays.toString(list1.toArray()));
24+
25+
Collections.shuffle(list1);
26+
27+
28+
29+
System.out.println(Arrays.toString(list1.toArray()));
30+
31+
32+
// 假如不再修改
33+
34+
List list2 = Collections.unmodifiableList(list1);
35+
36+
System.out.println(list2.getClass());
37+
38+
list2.set(8,10);
39+
40+
System.out.println(Arrays.toString(list2.toArray()));
41+
42+
list2.add(11);
43+
44+
System.out.println(Arrays.toString(list2.toArray()));
45+
}
46+
47+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package java0.conc0303.collection;
2+
3+
import java.util.Comparator;
4+
import java.util.TreeMap;
5+
6+
public class TreeMapDemo {
7+
8+
public static void main(String[] args) {
9+
10+
//
11+
TreeMap<Integer, String> map = new TreeMap<>(Comparator.reverseOrder());
12+
map.put(3, "val");
13+
map.put(2, "val");
14+
map.put(1, "val");
15+
map.put(5, "val");
16+
map.put(4, "val");
17+
// {5=val, 4=val, 3=val, 2=val, 1=val}
18+
System.out.println(map);
19+
20+
TreeMap<Integer, String> map1 = new TreeMap<>(Comparator.naturalOrder());
21+
map1.putAll(map);
22+
System.out.println(map1);
23+
}
24+
25+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package java0.conc0303.stream;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.concurrent.BlockingQueue;
6+
import java.util.concurrent.LinkedBlockingQueue;
7+
import java.util.stream.Collectors;
8+
import java.util.stream.IntStream;
9+
10+
public class StreamParallelDemo {
11+
public static void main(String[] args) {
12+
List<Integer> list = new ArrayList<>();
13+
IntStream.range(1, 10000).forEach(i -> list.add(i));
14+
BlockingQueue<Long> blockingQueue = new LinkedBlockingQueue(10000);
15+
List<Long> longList = list.stream().parallel()
16+
.map(i -> i.longValue())
17+
.sorted()
18+
.collect(Collectors.toList());
19+
// // 串行,单线程
20+
// longList.stream().forEach(
21+
// 并行,默认使用CPU * 2个线程
22+
longList.stream().parallel().forEach(
23+
i -> {
24+
try {
25+
blockingQueue.put(i);
26+
} catch (InterruptedException e) {
27+
e.printStackTrace();
28+
}
29+
});
30+
System.out.println("blockingQueue:" + blockingQueue.toString());
31+
}
32+
33+
34+
}

0 commit comments

Comments
 (0)