第13章+线程安全与锁优化

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

猜你喜欢

转载自blog.csdn.net/Quantum_Dog/article/details/88414150