13.2.1 Java语言中的线程安全
2 绝对线程安全
代码清单13-2, 对Vector线程安全的测试
/*
* 代码清单13-2, 对Vector线程安全的测试
*/
package cn.chapter13;
import java.util.Vector;
public class Solution13_2 {
private static Vector<Integer> vector = new Vector<Integer>();
public static void main(String[] args) {
while(true){
for(int i =0 ;i<10;i++){
vector.add(i);
}
Thread removeThread = new Thread(new Runnable(){
@Override
public void run(){
for(int i = 0;i<vector.size();i++){
vector.remove(i);
}
}
});
Thread printThread = new Thread(new Runnable(){
@Override
public void run(){
for(int i = 0;i<vector.size();i++){
System.out.println(vector.get(i));
}
}
});
removeThread.start();
printThread.start();
//不要同时产生过多的线程,否则会导致操作系统假死
while(Thread.activeCount()>10);
}
}
}
运行结果:
2
8
6
6
Exception in thread "Thread-151823" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 9
at java.util.Vector.get(Vector.java:744)
at cn.chapter13.Solution13_2$2.run(Solution13_2.java:32)
at java.lang.Thread.run(Thread.java:745)
2
6
0
代码清单13-3,必须加入同步以保证Vector访问线程安全性
/*
* 代码清单13-3,必须加入同步以保证Vector访问线程安全性
*/
package cn.chapter13;
import java.util.Vector;
public class Solution13_3 {
private static Vector<Integer> vector = new Vector<Integer>();
public static void main(String[] args) {
while(true){
for(int i =0 ;i<10;i++){
vector.add(i);
}
Thread removeThread = new Thread(new Runnable(){
@Override
public void run(){
synchronized(vector){
for(int i = 0;i<vector.size();i++){
vector.remove(i);
}
}
}
});
Thread printThread = new Thread(new Runnable(){
@Override
public void run(){
synchronized(vector){
for(int i = 0;i<vector.size();i++){
System.out.println(vector.get(i));
}
}
}
});
removeThread.start();
printThread.start();
//不要同时产生过多的线程,否则会导致操作系统假死
while(Thread.activeCount()>10);
}
}
}
运行结果:(太多了,就截取了一小部分)
5
6
7
8
9
0
13.2.2 线程安全的实现方法
2 非阻塞同步
代码清单13-4, Atomic的原子自增运算
/*
* 代码清单13-4, Atomic的原子自增运算
*/
package cn.chapter13;
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicTest {
public static AtomicInteger race = new AtomicInteger(0);
public static void increase(){
race.incrementAndGet();
}
private static final int THREADS_COUNT = 20;
public static void main(String[] args) {
Thread [] threads = new Thread[THREADS_COUNT];
for(int i = 0;i<THREADS_COUNT;i++){
threads[i] = new Thread(new Runnable(){
@Override
public void run(){
for(int i = 0;i<10000;i++){
increase();
}
}
});
threads[i].start();
}
while(Thread.activeCount()>1)
Thread.yield();
System.out.println(race);
}
}
运行结果:
200000