线程安全与线程池
概念:多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题。
出现线程安全问题的条件,原因:1.存在多个线程在同时执行 2.同时访问一个共享资源 3.存在修改该共享资源
线程同步:是线程安全问题的解决方案
线程安全的核心思想
让多个线程先后依次访问共享资源,这样就可以避免出现线程安全问题。
线程同步的常见方案
加锁:每次只允许一个线程加锁,加锁后才能进入访问,访问完毕后自动解锁,然后其他线程才能再加锁进来。
方式一:同步代码块
作用:把访问共享资源的核心代码给上锁,以此保证线程安全。
原理:每次只允许一个线程加锁后进入,执行完毕后自动解锁,其他线程才可以进行执行。
同步锁注意事项
对于当前同时执行的线程来说,同步锁必须是同一把(同一对象),否则会出现bug。
锁对象随便选择一个唯一的对象会影响到其他无关线程的执行
锁对象的使用规范:
建议使用共享资源作为锁对象,对于实例方法建议使用this作为锁对象。
对于静态方法建议使用字节码(类名.class)对象作为锁对象。
同步方法:
同步代码块还是同步方法好?
范围上:同步代码块锁的范围更小,同步方法锁的范围更大
可读性:同步方法更好
lock锁
线程池
线程池就是一个可以复用线程的技术
创建线程池
方法一:ThreadPoolExecutor创建线程池
处理Runnable任务
ExecutorService
线程池的注意是是事项
处理Callable任务
ExecutorService的常用方法
方法二:通过Executors创建线程池

并发/并行
进程