java面试题/认证答辩 ---多线程

参考:
>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,直接丢弃)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值