![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
高并发与多线程
Azadoo
这个作者很懒,什么都没留下…
展开
-
多线程并发 面试题
线程的生命周期与三种创建方式线程的生命周期 与创建线程的三种方式线程常见面试题原创 2020-06-27 22:53:21 · 136 阅读 · 0 评论 -
锁优化 适应性自旋锁消除(Lock Elimination)锁膨胀(Lock Coarsening) 轻量级锁(Lightweight Locking) 偏向锁(Biased Locking)
本文将介绍 适应性自旋锁消除(Lock Elimination)锁膨胀(Lock Coarsening) 轻量级锁(Lightweight Locking) 偏向锁(Biased Locking)等锁优化技术自旋锁与自适应自旋互斥同步对性能最大的影响就是阻塞的实现 挂起线程和恢复线程的操作都是需要转入内核态中完成 这些给java虚拟机的并发性能带来了很大压力 同时在许多应用上 共享数据的锁定状态只会持续很短一段时间 为了这段时间去挂起和恢复线程挺不值得 而绝大多数的电脑与服务器都是多核处理器系统 可以让原创 2020-06-17 22:02:24 · 421 阅读 · 0 评论 -
线程安全及实现方法
何为线程安全当多个线程同时访问一个对象时 如果不考虑这些线程在运行时环境下的调度和交替执行 也不需要进行额外的同步 或者在调用方进行任何其他的协调操作 调用这个对象的行为都可以获得正确的结果 那就称这个对象是线程安全的java中的线程安全按照线程安全的“安全程度”由强到弱来排序 可以将java语言中各种操作共享的数据分为以下五类:不可变 绝对线程安全 相对线程安全 线程兼容 线程对立不可变一定是线程安全的如果对线程共享的数据是一个基本数据类型 只要在定义时使用final关键字修饰 就可以保证是原创 2020-06-16 22:46:36 · 249 阅读 · 0 评论 -
volatile关键字
是Java虚拟机提供的最轻量级的同步机制当一个变量被定义成volatile后 具备两种特性:保证此变量对所有线程的可见性(当一条线程修改了这个变量的值 新值对于其他线程来说是可以立即得知的) 但是volatile变量的运算在并发下并不是安全的在不符合这两种规则的场景下仍需要加锁来保证原子性运算结果并不依赖变量的当前值 或者能够确保只有单一的线程修改变量的值变量不需要与其他的状态变量共同参与不变约束禁止指令重排序优化 普通的变量仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正原创 2020-06-15 17:20:37 · 88 阅读 · 0 评论 -
Thread的方法
1.创建线程对象Thread,默认有一个线程名,以Thread-开头, 从0开始计数构造函数Thread ()Thread-0Thread-1Thread-2Thread-3Thread t = new Thread();继续点开initThreadGroup 线程组target 目标执行的 (策略模式的接口)name 线程名字stackSize 栈的大小关于默认name命名规则:2.如果在构造Thread的时候没有传递Runnable或者没有复写Thread的run方法,该Thre原创 2020-06-08 00:05:49 · 308 阅读 · 0 评论 -
线程池
背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。好处:◆提高响应速度(减少了创建新线程的时间)◆降低资源消耗(重复利用线程池中线程,不需要每次都创建)◆便于线程管理(…1. corePoolSize: 核心池的大小2. maximumPoolSize: 最大线程数3. keepAlive Time:线程没有任务时最多保持多长时间原创 2020-06-06 17:10:19 · 95 阅读 · 0 评论 -
线程通信 管程法与信号灯法
应用场景:生产者和消费者问题◆假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费.◆如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止.◆如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止.这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件.◆对于生产者,没有生产产品之前,要通知消费者等待.而生产了产品之后,又需要马.上通知消费者原创 2020-06-06 14:08:11 · 511 阅读 · 0 评论 -
同步锁
从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当java.util.concurrent.locks.L ock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可原创 2020-06-05 23:04:20 · 195 阅读 · 0 评论 -
死锁
多个线程各自占有一 些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题.产生死锁的四个必要条件:互斥条件:一个资源每次只能被一个进程使用。请求与保持条件: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。死锁: 多个线程互相抱着对方需要原创 2020-06-05 21:28:21 · 96 阅读 · 0 评论 -
线程同步 synchronized的两种用法
由于同一进程的多个线程共享同-块存储空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中被访问时的正确性,在访问时加入锁机制synchronized ,当一个线程获得对象的排它锁,独占资源,其他线程必须等待,使用后释放锁即可.存在以下问题:◆一个线程持有锁会导致其他所有需要此锁的线程挂起;◆在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题;◆如果一个优先级高的线程等待一个优先级低的线程释放锁 会导致优先级倒置,引起性能问题.核心思想线程就是独立的执行路径;原创 2020-06-05 15:09:22 · 251 阅读 · 0 评论 -
Thread线程的停止 休眠 礼让 Join 观测 优先级 守护线程
停止线程◆不推荐使用JDK提供的stop()、destroy()方法。[已废弃]◆推荐线程自己停止下来◆建议使用一个标志位进行终止变量当flag=false,则终止线程运行。线程休眠.◆sleep (时间)指定当前线程阻塞的毫秒数;(1000)为1s◆sleep存在异常InterruptedException;◆sleep时间达到后线程进入就绪状态;◆sleep可以模拟网络延时,倒计时等。可将问题放大每一个对象都有一个锁,sleep不会释放锁;线程礼让礼让线程,让当前正在执行的线程.原创 2020-06-04 22:33:29 · 137 阅读 · 0 评论 -
线程的生命周期 与创建线程的三种方式
1.Java应用程序的main函数是一个线程,是被JVM启动的时候调用,线程的名字叫main2.实现一个线程,必须创建Thread实例, override run方法,并且调用start方法3.在JVM启动后,实际上有多个线程,但是至少有一个非守护线程4.当你调用一个线程start方法的时候,此时至少有两个线程,一个是调用你的线程,还有一个执行run方法的线程5.线程的生命周期分为new, runnable, running, block, terminated...原创 2020-06-04 15:58:04 · 362 阅读 · 0 评论 -
CAS
CAS: 没有锁的状态下 多线程访问时保证线程一致性去改动某个值ABA问题:原数据是A要改成B 但是改动途中有人把A改成A解决方式:对当前值加版本号 每次改动更新版本号原创 2020-06-02 17:44:23 · 111 阅读 · 0 评论