参考:
>https://blog.csdn.net/xy3233/article/details/91812494
>
线程安全的定义:
当多个线程访问某个类时,不管采用任何调度方式,不需要额外的同步或者协调,这个类都能表现出正确的结果,这个类就成为是线程安全的
线程的安全性主要体现在:
(1) 原子性: 一个或者多个操作,要么全部被执行,要么不执行。
(2) 可见性: 多个线程共同操作一个共享变量时,其他线程可以立即看到修改后的结果
(3) 有序性: 程序的执行顺序按照代码的先后顺序来执行。一般情况因为指令重排序,执行顺序并不一样
原子性实现方式:
① syncchronized 不可中断锁,适合竞争不激烈,可读性好
② Lock: 可中断锁,多样化同步, 竞争激烈时能维持常态
③Atomic: 竞争激烈时能维持常态,比Lock性能好,只能同步一个值。
可见性:
不可见的原因:
① 线程交叉执行
② 重排序结合线程交叉执行
③ 工作内存和主内存中的共享变量没有及时更新
可见性实现方式:
① syncchronized 解锁前将共享变量刷新到主内存中 加锁前从主内存中重新读取最新值
② volatile: 加入内存屏障和禁止重排序
**有序性**
重排序不会影响单线程的执行结果, 但会影响多线程的执行
使用 ① syncchronized ② Lock ③Atomic 禁止重排序
多线程实现方式:
①继承Thread类
②实现Runnable接口
③实现Callable 可以返回结果的
线程池 ThreadPoolExecutor
核心线程数 coprePoolSize:
最大线程数 maximumPoolSize: 当workQueue满了才会创建新的线程执行
空闲时间: 线程没有任务执行时最多保持多久时间终止(核心线程中的线程空闲时间)
线程工厂: 用来创建线程
阻塞队列: 存储等待执行的任务,核心线程池满的时候未执行的线程会放在workQueue中
拒绝策略: workQueue满了.最大线程池满了,再有新线程提交(有四种策略1,直接抛出异常(默认);2,用调用者所在的线程执行任务;3,丢弃阻塞队列中靠最前的任务;4,直接丢弃)
coprePoolSize: 核心线程数量 (有线程就放在里面执行,即便有线程是空闲的,也创建新的线程)
maximumPoolSize: 最大线程数 (当workQueue满了才会创建新的线程执行)
workQueue:阻塞队列,存储等待执行的任务,线程池满的时候未执行的线程会放在workQueue中
keepAliveTime:线程没有任务执行时最多保持多久时间终止(核心线程中的线程空闲时间)
threadFactory:线程工厂,用来创建线程
rejectHandler:拒绝策略 workQueue满了.线程池满了,再有新线程提交(有四种策略1,直接抛出异常(默认);2,用调用者所在的线程执行任务;3,丢弃阻塞队列中靠最前的任务;4,直接丢弃)
最后
以上就是着急茉莉为你收集整理的java面试题/认证答辩 ---多线程的全部内容,希望文章能够帮你解决java面试题/认证答辩 ---多线程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复