java多线程JUC库分析

  1. 锁能够解决并发共抢资源的问题,例子如下

public class Test {

    private static int sum;


    public static void main(String[] args) {

        for (int i = 0; i< 100; i++){
            Thread t = new Thread(new Calc());
            t.start();
        }
        try{
            Thread.sleep(1000);
        } catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(sum);
    }

    static class Calc implements Runnable {

        @Override
        public void run() {

            sum++;

            System.out.println(Thread.currentThread().getName() +":"+ sum);
        }
    }
}

启动100个线程对sum进行累加,结果不一定是100,优化,加锁后问题解决


public class Test {

    private static volatile int sum;
    private static ReentrantLock lock;

    public static void main(String[] args) {
        lock = new ReentrantLock();
        for (int i = 0; i< 100; i++){
            Thread t = new Thread(new Calc());
            t.start();
        }
        try{
            Thread.sleep(1000);
        } catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(sum);
    }

    static class Calc implements Runnable {

        @Override
        public void run() {
            lock.lock();
            sum++;
            lock.unlock();
            System.out.println(Thread.currentThread().getName() +":"+ sum);
        }
    }
}

题外话:上述例子还有一个细节就是,volatile ,没有volatile ,不影响最终结果,但是线程打印的值有重复。这里验证类volatile的可见性,一个线程修改,其他线程立即可见。
java多线程JUC库分析_第1张图片

  1. 锁的Condition,condition是条件,用于共同完成一项作业,需要协作的场景。

你可能感兴趣的:(java多线程juc)