MultiThread
- MultiThread
- 分类
- Dec 11, 2019
线程池的四种构造方式
Executor是一个顶层接口,java通过Executors工厂类提供了newFixThreadPool和newCachedThreadPool等方法,方便创建线程池。 在这里工厂方法底层,实际上都是通过new ThreadPoolExecutor来完成; 构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); } 参数 作用 corePoolSize 核心线程数,如果不设置allowCoreThreadTimeOut为true;它将常驻内存 maximumPoolSize 线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。如果使用了==无界的任务队列==这个参数就没用了...
Read More - Apr 21, 2018
JAVA并发编程实战笔记——对象共享
对象共享 package com.git.poan.multithreadpractice; public class NoVisibility { private static boolean ready; private static int number; public static void main(String[] args) throws InterruptedException { Thread readThread = new Thread(() -> {...
Read More - Apr 21, 2018
JAVA并发编程实战笔记——线程安全?
线程安全问题? 原书里面给的定义:某个类的行为与其规范完全一致。(反过来说,就是竞态条件下,类的方法不会出现预料以外的结果) 那么什么时候会出现类的行为与其规范不一致? 竞态 Java提供了多线程,也就是说任意方法都会被并发访问,但又不是所有方法都会被多个线程并发访问到(如果以我自己经验来说,也就单例的getInstance方法有可能会被多线程并发调用); 所以第一步应该明确自己业务中哪些方法的调用会存在竞态; 竞态下资源更新 如果这个方法存在竞态,而该方法本身又不涉及到更新操作,比如: pubulic int get() { return 1; } 这个方法就算被N个线程并发访问,也不会有安全问题。。。 如果返回的是一个final类型的,也不会有安全问题。。。 如果一个方法本身涉及到一个资源的更新(类中某个变量的赋值、修改之类的操作),出现了竞态,那么就有可能出现线程安全问题; 比如前一篇中的情况就是线程不安全的; 竞态下不可避免的资源更新——同步 如果一个方法存在竞态,可以尽量将更新的资源放到外面;如果不可避免,则需要使用同步; 在前一篇里面使用了synchronized实现同步,实际上还有volatile、Atomic、ReentrantLock同步机制。
Read More - Apr 21, 2018
i++线程安全问题
自加操作多线程读取时的问题 在《JAVA并发编程实战》中,解释了i++在多线程情况下的坑 我这里稍微模拟了一下: package com.git.poan.multithreadpractice; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class UnsafeSequence { private int val; public int getNextVal() { return ++val;// 原书使用的是val++;感觉这样效果不直观 ,我用++val } public static void main(String[] args)...
Read More - Apr 5, 2018
wait、notify——生产者消费者
在Java中,wait、notify、notifyAll是Object的方法,在java中任何对象都可以作为锁,而这几个方法必须得在获取锁以后才能使用,否则会报InterruptedException异常 在生产者和消费者模式中,假设:生产者每生产一个(也可以是诺干个,一个简单点)产品,就会等待他人消费以免浪费生产力; 而消费者则是会等待生产者通知自己产品已产出,然后自己便去消费,随后通知生产者缺货了赶紧生产;这里比较简单的方式就是用java对象的wait和notify实现: package com.git.poan; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by poan on 2018/04/12. */ public class WaitNotityTest { public static void bake() { synchronized (WaitNotityTest.class) { for...
Read More