java多线程JUC库分析
- 锁能够解决并发共抢资源的问题,例子如下
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);
}
}
}
【java多线程JUC库分析】启动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的可见性,一个线程修改,其他线程立即可见。
文章图片
- 锁的Condition,condition是条件,用于共同完成一项作业,需要协作的场景。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 事件代理