java.util.concurrent,并发包
- CopyOnWriteArrayList是线程安全的。
package util;
import java.util.concurrent.CopyOnWriteArrayList;
public class TestCopyOnWriteArrayList {
public static void main(String[] args) {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
for(int i = 0; i< 10000;i++){
new Thread(()->{
list.add(Thread.currentThread().getName());
});
}
try {
Thread.sleep(3000);//这里是为了防止主线程先执行完,而子线程还没有创建完,获取的list.size()可能不准,所以让主线程休眠,确保子线程执行完。
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(list.size());
}
}
- java.util.concurrent.locks.Lock
synchronized是隐式锁,Lock是显示锁。ReentrantLock类是可重入锁,实现了Lock,不要忘记释放锁。
![](https://img.haomeiwen.com/i15577479/c51f4e8275d5fd30.png)
![](https://img.haomeiwen.com/i15577479/bd3633d653a530d4.png)
import java.util.concurrent.locks.ReentrantLock;
public class TestLock implements Runnable {
private static int ticketNum = 3;
private boolean flag = true;
//定义Lock锁
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (flag) {
try {
lock.lock();//加锁
if (ticketNum > 0) {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "获得票" + ticketNum--);
} else {
flag = false;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock(); //释放锁
}
}
}
public static void main(String[] args) {
TestLock lock = new TestLock();
Thread thread = new Thread(lock);
Thread thread1 = new Thread(lock);
Thread thread2 = new Thread(lock);
thread.start();
thread1.start();
thread2.start();
}
}
网友评论