ArrayList和Vector有什麼區別?HashMap和HashTable有什麼區別?StringBuilder和StringBuffer有什麼區別?這些都是Java面試中常見的基礎問題
非線程安全的現象模擬
這裡就使用ArrayList和Vector二者來說明
下面的代碼
[java]
public class Main
{
public static void main(String[] args)
{
// 進行
for(int i =
{
test();
}
}
public static void test()
{
// 用來測試的List
List<Object> list = new ArrayList<Object>();
// 線程數量(
int threadCount =
// 用來讓主線程等待threadCount個子線程執行完畢
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
// 啟動threadCount個子線程
for(int i =
{
Thread thread = new Thread(new MyThread(list
thread
}
try
{
// 主線程等待所有子線程執行完成
countDownLatch
}
catch (InterruptedException e)
{
e
}
// List的size
System
}
}
class MyThread implements Runnable
{
private List<Object> list;
private CountDownLatch countDownLatch;
public MyThread(List<Object> list
{
this
untDownLatch = countDownLatch;
}
public void run()
{
// 每個線程向List中添加
for(int i =
{
list
}
// 完成一個子線程
untDown();
}
}
public class Main
{
public static void main(String[] args)
{
// 進行
for(int i =
{
test();
}
}
public static void test()
{
// 用來測試的List
List<Object> list = new ArrayList<Object>();
// 線程數量(
int threadCount =
// 用來讓主線程等待threadCount個子線程執行完畢
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
// 啟動threadCount個子線程
for(int i =
{
Thread thread = new Thread(new MyThread(list
thread
}
try
{
// 主線程等待所有子線程執行完成
countDownLatch
}
catch (InterruptedException e)
{
e
}
// List的size
System
}
}
class MyThread implements Runnable
{
private List<Object> list;
private CountDownLatch countDownLatch;
public MyThread(List<Object> list
{
this
untDownLatch = countDownLatch;
}
public void run()
{
// 每個線程向List中添加
for(int i =
{
list
}
// 完成一個子線程
untDown();
}
}
上面進行了
輸出結果
上面的輸出結果發現
這就是非線程安全帶來的問題了
再用線程安全的Vector來進行測試
[java]
List<Object> list = new ArrayList<Object>();
List<Object> list = new ArrayList<Object>();改成
[java]
List<Object> list = new Vector<Object>();
List<Object> list = new Vector<Object>();
再運行程序
輸出結果
再多跑幾次
再換成LinkedList試試
二者如何取捨
非線程安全是指多線程操作同一個對象可能會出現問題
線程安全必須要使用很多synchronized關鍵字來同步控制
所以在使用的時候
非線程安全!=不安全
有人在使用過程中有一個不正確的觀點
非線程安全並不是多線程環境下就不能使用
如果是每個線程中new一個ArrayList
線程安全的實現
線程安全是通過線程同步控制來實現的
在這裡
非線程安全的計數器
[java]
public class Main
{
public static void main(String[] args)
{
// 進行
for(int i =
{
test();
}
}
public static void test()
{
// 計數器
Counter counter = new Counter();
// 線程數量(
int threadCount =
// 用來讓主線程等待threadCount個子線程執行完畢
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
// 啟動threadCount個子線程
for(int i =
{
Thread thread = new Thread(new MyThread(counter
thread
}
try
{
// 主線程等待所有子線程執行完成
countDownLatch
}
catch (InterruptedException e)
{
e
}
// 計數器的值
System
}
}
class MyThread implements Runnable
{
private Counter counter;
private CountDownLatch countDownLatch;
public MyThread(Counter counter
{
unter = counter;
untDownLatch = countDownLatch;
}
public void run()
{
// 每個線程向Counter中進行
for(int i =
{
counter
}
// 完成一個子線程
untDown();
}
}
class Counter
{
private int count =
public int getCount()
{
return count;
}
public void addCount()
{
count++;
}
}
public class Main
{
public static void main(String[] args)
{
// 進行
for(int i =
{
test();
}
}
public static void test()
{
// 計數器
Counter counter = new Counter();
// 線程數量(
int threadCount =
// 用來讓主線程等待threadCount個子線程執行完畢
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
// 啟動threadCount個子線程
for(int i =
{
Thread thread = new Thread(new MyThread(counter
thread
}
try
{
// 主線程等待所有子線程執行完成
countDownLatch
}
catch (InterruptedException e)
{
e
}
// 計數器的值
System
}
}
class MyThread implements Runnable
{
private Counter counter;
private CountDownLatch countDownLatch;
public MyThread(Counter counter
{
unter = counter;
untDownLatch = countDownLatch;
}
public void run()
{
// 每個線程向Counter中進行
for(int i =
{
counter
}
// 完成一個子線程
untDown();
}
}
class Counter
{
private int count =
public int getCount()
{
return count;
}
public void addCount()
{
count++;
}
}
上面的測試代碼中
但是上面代碼中的Counter未進行同步控制
輸出結果
稍加修改
[java]
class Counter
{
private int count =
public int getCount()
{
return count;
}
public synchronized void addCount()
{
count++;
}
}
class Counter
{
private int count =
public int getCount()
{
return count;
}
public synchronized void addCount()
{
count++;
}
}
上面只是在addCount()方法中加上了synchronized同步控制
輸出結果
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27519.html