juc包

java.util.concurrent,并发包

  1. 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());
    }
}
  1. java.util.concurrent.locks.Lock
    synchronized是隐式锁,Lock是显示锁。ReentrantLock类是可重入锁,实现了Lock,不要忘记释放锁。
image

image
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();


    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。