您的位置:首页 > 运维架构

多线程之-CopyOnWriteArrayList

2015-03-23 22:07 253 查看
1、测试ArrayList为线程不安全的方法

package jdk;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;

/**
* Created by yesh on 2015/3/23.
*/
public class TestCopyOnWriteArrayList {

public List<Object> list = new ArrayList<Object>();

public CountDownLatch countDownLatch = new CountDownLatch(20);

public static void main(String[] args) throws InterruptedException {
final TestCopyOnWriteArrayList arrayList = new TestCopyOnWriteArrayList();
for(int i=0;i<20;i++) {
new Thread(new Runnable() {
@Override
public void run() {
arrayList.add();
}
}).start();
}
arrayList.countDownLatch.await();
System.out.println(arrayList.list.size());
}

public void add(){
int size = 1000;
for(int i=0;i<size;i++) {
try {
list.add(new Object());
}finally {
}
}
countDownLatch.countDown();
}
}


输出结果:

Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 109
at java.util.ArrayList.add(ArrayList.java:441)
at jdk.TestCopyOnWriteArrayList.add(TestCopyOnWriteArrayList.java:35)
at jdk.TestCopyOnWriteArrayList$1.run(TestCopyOnWriteArrayList.java:23)
at java.lang.Thread.run(Thread.java:744)


2、提供线程安全的方式,使用Lock lock = new ReentrantLock(); 提供

package jdk;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* Created by yesh on 2015/3/23.
*/
public class TestCopyOnWriteArrayList {

public List<Object> list = new ArrayList<Object>();

public CountDownLatch countDownLatch = new CountDownLatch(20);

public static void main(String[] args) throws InterruptedException {
final TestCopyOnWriteArrayList arrayList = new TestCopyOnWriteArrayList();
for(int i=0;i<20;i++) {
new Thread(new Runnable() {
@Override
public void run() {
arrayList.add();
}
}).start();
}
arrayList.countDownLatch.await();
System.out.println(arrayList.list.size());
}

private Lock lock = new ReentrantLock(); //使用Lock来使用

public void add(){
int size = 1000;
for(int i=0;i<size;i++) {
try {
lock.lock();
list.add(new Object());
}finally {
lock.unlock();
}
}
countDownLatch.countDown();
}
}


3、使用CopyOnWriteArrayList来保证线程安全,他都写入是线程安全的

package jdk;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;

/**
* Created by yesh on 2015/3/23.
*/
public class TestCopyOnWriteArrayList {

public List<Object> list = new CopyOnWriteArrayList<Object>();

public CountDownLatch countDownLatch = new CountDownLatch(20);

public static void main(String[] args) throws InterruptedException {
final TestCopyOnWriteArrayList arrayList = new TestCopyOnWriteArrayList();
for(int i=0;i<20;i++) {
new Thread(new Runnable() {
@Override
public void run() {
arrayList.add();
}
}).start();
}
arrayList.countDownLatch.await();
System.out.println(arrayList.list.size());
}

public void add(){
int size = 1000;
for(int i=0;i<size;i++) {
try {
list.add(new Object());
}finally {
}
}
countDownLatch.countDown();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: