线程阻塞

Java线程常见面试题

主宰稳场 提交于 2020-04-08 12:30:25
v 多线程实现手段: (1)、继承Thread类 (2)实现Runable接口 (3)使用线程池 v 线程控制在那个包: java.util.concurrent。 (1) 提供了线程的运行、 (2) 线程池的创建、 (3) 线程生命周期的控制 v 线程池 java.util.concurrent.Executors创建线程池的四种方法 (1) newCachedThreadPool创建 非固定数量 , 可缓存的线程池 ,若线程池超过处理需要,可灵活回收空线程,若没有线程可回收,则建新 (2) newFixedThreadPool 固定线程池 ,底层是无界队列,可 控制最大并发数 ,超出的线程会在队列中等待 (3) newScheduledThreadPool 定时执行线程池 , 支持定时及周期性任务执行 (4) newSingleThreadExecutor单线程化的线程池,只会用唯一的工作线程来执行任务, 保证所有任务按照顺序执行 。 如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它 v Sleep()和 Wait()的区别 (1) Sleep()是Thread的方法,Wait()是Object的方法 (2) Sleep( 休眠 )暂停指定时间,执行是CPU让出来,但对象锁继续保持。休眠时间到之后自动回复就绪状态。Wait( 线程暂停执行 )当前线程放弃对象锁

[转帖]JVM源码分析之安全点safepoint

懵懂的女人 提交于 2020-04-08 08:52:36
JVM源码分析之安全点safepoint https://www.jianshu.com/p/c79c5e02ebe6 原来是这个意思.. 简书 占小狼 转载请注明原创出处,谢谢! 上周有幸参加了一次关于JVM的小范围分享会,听完R大对虚拟机C2编译器的讲解,我的膝盖一直是肿的,能记住的实在有点少,能听进去也不多 1、什么时候进行C2编译,如何进行C2编译(这个实在太复杂) 2、C2编译的时候,是对整个方法体进行编译,而不是某个方法段 3、JVM中的safepoint 一直都知道,当发生GC时,正在执行Java code的线程必须全部停下来,才可以进行垃圾回收,这就是熟悉的STW(stop the world),但是STW的背后实现原理,比如这些线程如何暂停、又如何恢复?就比较疑惑了。 然而这一切的一切,都涉及到一个概念safepoint,openjdk的实现位于 openjdk/hotspot/src/share/vm/runtime/safepoint.cpp 什么是safepoint safepoint可以用在不同地方,比如GC、Deoptimization,在Hotspot VM中,GC safepoint比较常见,需要一个数据结构记录每个线程的调用栈、寄存器等一些重要的数据区域里什么地方包含了GC管理的指针。 从线程角度看

MySQL打造扛得住的数据库架构.md-目前只有监控篇

怎甘沉沦 提交于 2020-04-08 04:53:26
[TOC] MySQL性能管理及架构设计笔记 数据库监控 要监控的内容 对数据库的可用性进行监控: 不是仅仅监控数据库进程是否存在,要通过网络连接到数据库并确定是可用的 对数据库性能进行监控: QPS TPS, 并发线程数量, innnoDB阻塞和死锁 对主从复制进行监控: 主从链路状态, 主从延迟, 主从数据一致性 对服务器资源监控: 磁盘: 且并不意味着磁盘空间大,MySQL能用的就大,因为可能分区分配的不够大. CPU使用率 内存使用情况 swap分区使用情况 网络IO使用情况 数据库可用性监控 确认数据库是否可用通过网络正常连接 要注意,如果我们在MySQL本机使用SQL来连接MySQL,这并不意味着外部也能通过tcp/ip协议来访问MySQL,因为外部面临的环境更为复杂. 比如tcp/ip被占满之类的, 所以我们必须通过远程服务器来实际的连接请求: 使用mysqladmin: # 如果数据库存活,该命令会返回mysqld is alive ~ ⌚ 23:30:42 $ mysqladmin -u root -p -h localhost ping Enter password: mysqld is alive 使用Telnet(一般作为手动使用) # telnet连接成功后,都懂得,只要不是提示连接失败,同时提供给我们可以交互式命令行,那就是成功了 ~ ⌚ 23:42

synchronized

梦想与她 提交于 2020-04-07 23:14:16
概念 是利用锁的机制来实现同步的。 互斥性: 即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。互斥性我们也往往称为操作的原子性。 可见性: 必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作从而引起不一致。 用法 修饰静态方法: //同步静态方法 public synchronized static void methodName() { try { TimeUnit.SECONDS.sleep(2); System.out.println(Thread.currentThread().getName()+" aaa"); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { for (int i = 0; i < 5; i++) { new Thread(SynchronizedDemo::methodName).start(); } } 当synchronized作用于静态方法时,其锁就是当前类的class对象锁

Volatile与Synchronized的区别

橙三吉。 提交于 2020-04-07 23:13:32
java线程的内存模型 java的线程内存模型中定义了每个线程都有一份自己的共享变量副本(本地内存),里面存放自己私有的数据,其他线程不能直接访问,而一些共享变量则存在主内存中,供所有线程访问。 上图中,如果线程A和线程B要进行通信,就要经过主内存,比如线程B要获取线程A修改后的共享变量的值,要经过下面两步: (1)、线程A修改自己的共享变量副本,并刷新到了主内存中。 (2)、线程B读取主内存中被A更新过的共享变量的值,同步到自己的共享变量副本中。 总结:在java内存模型中,共享变量存放在主内存中,每个线程都有自己的本地内存,当多个线程同时访问一个数据的时候,可能本地内存没有及时刷新到主内存,所以就会发生线程安全问题。 java多线程中的三个特性:   原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。一个很经典的例子就是银行账户转账问题:比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能保证不出现一些意外的问题。   可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。   有序性:就是程序执行的顺序按照代码的先后顺序执行。一般来说处理器为了提高程序运行效率,可能会对输入代码进行优化

Linux下的睡眠函数sleep(),thread创建线程,求Linux系统的时间间隔

浪尽此生 提交于 2020-04-07 21:03:30
1、.cc文件下的睡眠函数: this_thread::sleep_for(chrono::seconds(1));睡眠1秒 2、eg: g++ multithread.cc -o multithread -std=c++11 -lpthread -std=C++11 :表示采用C++11标准 -lpthread :表示 线程库。 3、用thread创建线程 4、join()的作用:阻塞主线程。 5、线程函数带参数 6、使用Linux计算两时间戳间的时间: 1 struct timeval start_time,end_time; 2 gettimeofday(&start_time,NULL); 3 double time_used=end_time.tv_sec-start_time.tv_sec+(end_time.tv_usec-start_time.tv_usec)/1000000.0; 来源: https://www.cnblogs.com/technicist/p/12655752.html

深度探索JFR

[亡魂溺海] 提交于 2020-04-07 19:54:35
2. JAVA 应用相关 2.4. Java Monitor 同步锁相关 主要是三种 Event: 当进入同步块,尝试获取锁的时候,产生 JavaMonitorEnter Event;当调用 Object.wait() 进入等待时,会产生 JavaMonitorWait Event;当 锁升级(另一种说法是锁膨胀)时,产生 JavaMonitorWait Event。 下面我从网上看到的这张图,有助于理解这三种事件: JavaMonitorEnter(Java Monitor Blocked):进入 Java Monitor Event。当需要进入同步代码时(字节码 monitorenter),会产生这个 Event。在 default.jfc 中默认为启用的,并且会追踪堆栈,阈值是 20ms;采集的信息包括:开始时间,持续时间,结束时间,线程,Monitor Address,Monitor Class,之前持有这个 Monitor 的线程。 JavaMonitorInflated(Java Monitor Inflated):发生锁升级的时候的 Event。在 default.jfc 中默认为启用的,并且会追踪堆栈,阈值是 20ms;采集的信息包括:开始时间,持续时间,结束时间,线程,Monitor Address,Monitor Class,锁升级原因

jvm主内存与工作内存

白昼怎懂夜的黑 提交于 2020-04-07 19:49:08
一、jvm主内存与工作内存 首先,JVM将内存组织为主内存和工作内存两个部分。 主内存主要包括本地方法区和堆。每个线程都有一个工作内存,工作内存中主要包括两个部分,一个是属于该线程私有的栈和对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓存区)。 1.所有的变量都存储在主内存中(虚拟机内存的一部分),对于所有线程都是共享的。 2.每条线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。 3.线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成。 JVM规范定义了线程对内存间交互操作: Lock(锁定):作用于主内存中的变量,把一个变量标识为一条线程独占的状态。 Read(读取):作用于主内存中的变量,把一个变量的值从主内存传输到线程的工作内存中。 Load(加载):作用于工作内存中的变量,把read操作从主内存中得到的变量的值放入工作内存的变量副本中。 Use(使用):作用于工作内存中的变量,把工作内存中一个变量的值传递给执行引擎。 Assign(赋值):作用于工作内存中的变量,把一个从执行引擎接收到的值赋值给工作内存中的变量。 Store(存储):作用于工作内存中的变量,把工作内存中的一个变量的值传送到主内存中。 Write(写入)

ThreadPoolExecutor 的基本原理

﹥>﹥吖頭↗ 提交于 2020-04-07 15:37:21
先说下 ThreadPoolExecutor 的基本原理: 1. 当提交一个任务时,如果线程数没有达到coreSize,那么就会新建一个线程,并绑定该任务,直到数量到达coreSize前都不会重用之前的线程 2.到达后,提交的任务都会放到一个等待队列中进行等待,线程池中的线程会使用take()阻塞的从等待队列拿任务 3.当队列有界,并且线程不能及时取走队列中的任务,等待队列有可能会满,那么线程池将会创建临时线程来执行任务 4.临时线程 通过poll(keepAliveTime,timeUnit)来执行任务,如果到了keepAliveTime还取不到,那么会被回收掉,临时线程的数量不能大于 maxPoolSize - coreSize 5.当线程数到达maxSize后,将会执行拒绝策略RejectedExecutionHandler,包括抛异常,静默拒绝,抛弃最old任务,使用原远程执行等策略 知道了原理你大概就知道线程被如何管理了 当一个task执行完,如果线程数小于coreSize,那么这个线程就会一直存在线程池中, 如果是临时线程,在等待keepAliveTime后,将会被回收掉 来源: https://www.cnblogs.com/zjm-1/p/12653532.html

java中线程队列BlockingQueue的用法

試著忘記壹切 提交于 2020-04-07 11:09:48
在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。 [ @more @] 认识BlockingQueue 阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示: 从上图我们可以很清楚看到,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出; 常用的队列主要有以下两种:(当然通过不同的实现方式,还可以延伸出很多不同类型的队列,DelayQueue就是其中的一种)   先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性。   后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件。 多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享。假设我们有若干生产者线程,另外又有若干个消费者线程。如果生产者线程需要把准备好的数据共享给消费者线程,利用队列的方式来传递数据,就可以很方便地解决他们之间的数据共享问题。但如果生产者和消费者在某个时间段内