随笔分类 - java 并发编程
摘要:atomicInteger原理 class A{ public final static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(); for (int i = 0; i < 10; i++
阅读全文
摘要:解释 wait/notify必须配合synchronized使用 demo class NotifyStop2 { private final Object lock = new Object(); public void add(String s) throws InterruptedExcept
阅读全文
摘要:Callable 通过Runable和Thread, 无法获取子线程的运行结果。 Java5 引入了java.util.concurrent, 可以获取到子线程的运行结果。 Future接口可以理解成一个任务, Future.get()方法可以获取任务的运行结果 虽然submit(task)是异步的
阅读全文
摘要:ReentrantLock 可重入 可中断 可限时 公平锁 简单示例 class ReentrantLockTest implements Runnable{ private static ReentrantLock reentrantLock = new ReentrantLock(); priv
阅读全文
摘要:锁的概念 在java中,每一个对象都有一把锁,这把锁放到对象头中,锁记录了当前对象被那个线程占用 对象结构 对象头 存放对象运行时候的基本信息 包含两个部分 class Point:指向方法区中的class对象(所以我们可以用对象来获取class)(4个字节) mark word:存放和当前对象运行
阅读全文
摘要:乐观锁实现重试机制 //乐观锁冲突最大重试次数 private static final int DEFAULT_MAX_RETRIES = 5; /** * 减少库存,每次减一 * * @return */ public boolean reduceStock(GoodsVo goods) { i
阅读全文
摘要:背景 数据的计算(1+1),首先是从内存中加载代cpu缓存中,在加载到cpy计算。cpu计算完成返回的结果放到cpy缓存区,至于什么时候在返回到内存,是不确定的,看cpu空闲时间。这就会造成并发问题。 比如2个cpu同时将主存中的数据加载到自己的缓存中,并且对这个数据进行操作,由于同时操作,肯定有一
阅读全文
摘要:任务定时调度 简单任务调度(Timer类) public static void main(String[] args) { Timer timer = new Timer(); //1秒后执行run(),只执行一次 // timer.schedule(new TimerTask() { // @O
阅读全文
摘要:线程的5种状态(生命周期) 新生: Thread a = new Thread(()->{}); 就绪:调用start(),阻塞事件解除,yield(让出本次cpu),jvm自动切换cpu,这4四种方式都会导致线程处于就绪转态,等待cpu重新来调度 运行:就绪的线程被cpu调用,有系统来控制 阻塞:
阅读全文