ReetrantLock 使用
1.1 不使用ReentrantLock 的时候
class MyList{
Integer intArr[] = new Integer[]{0,0,0};
int index = 0;
public void addNum(Integer num){
intArr[index] = num;
try {
Thread.sleep(1); // 模拟处理其他事情
}catch (Exception e){
}
index++;
}
public Integer[] getIntArr(){
return intArr;
}
}
public class Demo08 {
public static void main(String[] args) throws InterruptedException {
MyList myList = new MyList();
Runnable r1 = new Runnable() {
@Override
public void run() {
myList.addNum(1);
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
myList.addNum(2);
}
};
Runnable r3 = new Runnable() {
@Override
public void run() {
myList.addNum(3);
}
};
Thread thread1 = new Thread(r1);
Thread thread2 = new Thread(r2);
Thread thread3 = new Thread(r3);
thread1.start();
thread2.start();
thread3.start();
Thread.sleep(1000);
Integer intArr[] = myList.getIntArr();
for (int i = 0;i < intArr.length;i++){
System.out.println(intArr[i]);
}
}
}
3
0
0
分析:三个线程同时往myList中添加元素,存在并发问题,可能一个线程赋值intArr[index] = num;,还没来得及更新下标index,另一个线程也赋值了,出现覆盖的情况。
1.2 使用ReentrantLock
class MyList{
private Lock lock = new ReentrantLock();
Integer intArr[] = new Integer[]{0,0,0};
private int index = 0;
public void addNum(Integer num){
lock.lock(); // 加锁
try {
intArr[index] = num;
Thread.sleep(1); // 模拟处理其他事情
index++;
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock(); // 释放锁
}
}
public Integer[] getIntArr(){
return intArr;
}
}
public class Demo08 {
public static void main(String[] args) throws InterruptedException {
MyList myList = new MyList();
Runnable r1 = new Runnable() {
@Override
public void run() {
myList.addNum(1);
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
myList.addNum(2);
}
};
Runnable r3 = new Runnable() {
@Override
public void run() {
myList.addNum(3);
}
};
Thread thread1 = new Thread(r1);
Thread thread2 = new Thread(r2);
Thread thread3 = new Thread(r3);
thread1.start();
thread2.start();
thread3.start();
Thread.sleep(3000);
Integer intArr[] = myList.getIntArr();
for (int i = 0;i < intArr.length;i++){
System.out.println(intArr[i]);
}
}
}
1
2
3
分析: 加锁实现了同步,能正常往myList中添加元素