
java 多线程
qq_25825923
这个作者很懒,什么都没留下…
展开
-
线程的上线文切换
线程的上线文切换:指的是线程之间执行权的切换 线程的上线文切换过于频繁是会影响程序性能的 , 我们减少不必要的上下文切换:从业务上去减少上下文切换可以按照数据的id拆分或者hash拆分不同的线程处理不同的业务(服务器是多线程的情况下) 无锁编程 volatile 关键字 cas算法(Atomic 使用 的就是 volatile 关键字加 cas 不加锁自然就减少了切换时间...原创 2018-08-09 18:46:06 · 601 阅读 · 0 评论 -
java 队列同步器AbstractQueuedSynchronizer(AQS)实现分析
AQS 内部使用一个int变量state表示同步状态。 内部使用一个隐式的FIFO队列(并没有声明这样一个队列,只是通过每个节点记录它的上下节点来从逻辑上产生一个队列)来完成阻塞线程的排队。这个FIFO队列在 AQS 中被定义为一个内部类Node:EXCLUSIVE、SHARED: 节点的两种模式:独占模式和共享模式,分别对应独占锁和共享锁。Thread:就...原创 2018-10-14 16:39:49 · 173 阅读 · 0 评论 -
java 队列同步器AbstractQueuedSynchronizer(AQS)
队列同步器AbstractQueuedSynchronizer(AQS),是用来构建锁或者其他同步组件的基础框架如对获取锁失败线程的阻塞、唤醒,都是AQS替我们实现,ReentrantLock,ReentrantReadWriteLock和CountDownLatch等都是用AQS实现的。队列同步器AbstractQueuedSynchronizer:内部使用一个int变量state...原创 2018-09-27 19:55:52 · 172 阅读 · 0 评论 -
多线程基础7 多线程与并发库
多线程与并发库BlockingQueue队列BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.import j...原创 2018-09-20 19:52:26 · 144 阅读 · 0 评论 -
多线程基础 6 线程池
线程池概述 * 程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用ExecutorService pool = Executors.newFixedThreadPool(2);...原创 2018-09-20 19:42:42 · 112 阅读 · 0 评论 -
多线程基础5 Lock 锁
1.同步 * 使用ReentrantLock类的lock()和unlock()方法进行同步2.通信 * 使用ReentrantLock类的newCondition()方法可以获取Condition对象 * 需要等待的时候使用Condition的await()方法, 唤醒的时候用signal()方法 * 不同的线程使用不同的Condition, 这样就能区分唤醒的时候找哪个线程了 ...原创 2018-09-20 19:40:22 · 149 阅读 · 0 评论 -
多线程基础4 同步与通信
1.什么情况下需要同步 当多线程并发执行同一代码时 希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步. 2.同步代码块 使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块 多个同步代码块如果使用相同的锁对象, 那么他们就是同步的 public class TestMain { public static vo...原创 2018-09-19 20:08:10 · 103 阅读 · 0 评论 -
线程基础3 线程中断
已经过时的方法:暂停 suspend() 恢复 resume() 停止 stop()过时原因:suspend()方法在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易引发死锁问题。stop()方法在终结一个线程时不会保证线程的资源正常释放。 线程中断的三个方法:interrupt() :中断线程 interrup...原创 2018-09-18 20:45:42 · 141 阅读 · 0 评论 -
Java的synchronized
一个加锁的方法 public void f(){ synchronized(this){ System.out.println("123"); } }上面的方法经过 javac 编译为 .class 文件 然后 javap -c 反编译如下 每个对象有一个monitor,即监视器,当且仅当monitor被占用时,这个monitor就被锁住了。...原创 2018-09-18 19:18:20 · 124 阅读 · 0 评论 -
java 多线程基础2
多线程(加入线程join)thread.join(); 被.join()的线程优先执行多线程(线程优先级Priority)Thread.setPriority(1-10)线程默认优先级是5。线程优先级的范围是:1-10。线程优先级高仅仅表示线程获取的 CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。多线程(守护线程setDaemo...原创 2018-09-18 16:46:37 · 126 阅读 · 0 评论 -
java多线程 基础
引入 1.什么是线程 线程是程序执行的一条路径, 一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率, 可以同时完成多项工作 2.多线程的应用场景 红蜘蛛同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时和多个人一起视频 服务器同时处理多个客...原创 2018-09-12 20:38:24 · 101 阅读 · 0 评论 -
java 多线程 双重锁检查
双重锁检查public class User { private static User user; public static User getInstance() { if (user == null) { // 1:第一次检查 synchronized (User.class) { // 2:加锁 ...原创 2018-09-12 19:52:32 · 302 阅读 · 0 评论 -
java 产生红包多线程
import java.util.HashMap;import java.util.HashSet;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Optional;import java.util.Set;import java.util.concurr...原创 2018-09-06 16:20:56 · 353 阅读 · 0 评论 -
处理器如何实现原子操作 java 实现原子操作 转载
原文地址:http://www.infoq.com/cn/articles/atomic-operation1. 引言原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。2. 术语...转载 2018-08-28 19:37:00 · 242 阅读 · 0 评论 -
java线程和内存 java 重排序 java happens-before java 内存语义
线程之间的通信机制有两种: 共享内存:在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。 消息传递:在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信重排序: 重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序。 重排序分3种类型。 ...原创 2018-08-17 15:45:57 · 155 阅读 · 0 评论 -
java volatile 关键词
volatile特性:可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。 原子性:对任意单个volatile变量读写具有原子性,类似volatile++这种复合操作不具有原子性。 顺序性:对于volatile 修饰的关键字在编译的时候会加 内存屏障 fang防止冲排序volatile 的可见性:如图 volatile 修饰的变...原创 2018-08-22 16:10:24 · 110 阅读 · 0 评论 -
java 琐 事
https://cloud.tencent.com/developer/article/1363428转载 2019-02-15 11:46:27 · 165 阅读 · 1 评论