摘要: 一、应用场景举例 每个线程都应该有自己的数据库连接Connection,不能被其他线程所影响,就可以使用ThreadLocal(一个线程内各模块间共享同一数据,各线程间的数据又是独立的)。 二、使用举例 线程范围内的共享变量,每个线程有自己独立的数据。例如每个线程要有自己独立的连接。ThreadLo 阅读全文
posted @ 2018-08-19 17:42 湮天霸神666 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 队列:先进先出 1)ArrayBlockingQueue,固定大小队列 当固定大小的队列满了时,可以选择以抛异常(Throws exception)、立马返回判断值(Special value)、阻塞(Blocks)中的1种形式进行操作。如下图。 案例1:有2个线程从队列取数据,有1个线程往队列放数 阅读全文
posted @ 2018-08-13 20:53 湮天霸神666 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 一、Semaphere信号灯 Semaphere与互斥锁的区别:有多个线程时,只有获得互斥锁的那个才能进入,而信号灯是可以同时多个线程一起运行的,信号灯为1时相当于互斥锁。 等待的线程准备获得信号灯的顺序是随机的,但可以设置先到先得。 假设有10个线程,但只有3个信号灯,能实现并发访问的线程数只能为 阅读全文
posted @ 2018-08-13 20:52 湮天霸神666 阅读(119) 评论(0) 推荐(0) 编辑
摘要: 一、线程锁:Lock 代替synchronized Lock的作用类似于传统线程模型中的synchronized,更体现面向对象的思想,两个线程执行的代码片段要实现同步互斥的效果,必须要用同一个Lock对象。 1)ReentrantLock 锁中的代码出现异常可能会出现死锁,最好finally释放锁 阅读全文
posted @ 2018-08-13 20:51 湮天霸神666 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 一、线程池 TCP服务器编程模型中,每来一个客户端连接时,服务端就要创建一个新线程为之服务,当与客户端的会话结束时,线程也就结束了。 在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有无空闲线程,再把任务交给内部某个空闲的线程,一个线程同时只能执 阅读全文
posted @ 2018-08-13 20:50 湮天霸神666 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 一、创建线程的两种方式 (1)子类继承Thread,并重写run方法 (2)实现Runnable接口,传到thread里 一般用第二种方式,实现接口不影响继承其他父类。 如果Thread类既重写了run方法,又传了一个Runnable接口,会调用Thread子类重写的run方法,因为找Runnabl 阅读全文
posted @ 2018-08-13 20:47 湮天霸神666 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 优化一:自旋锁与自适应自旋 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。共享数据的锁定状态只会持续很短的一段时间,让后面请求锁的那个线程“稍等一下”,但不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了 阅读全文
posted @ 2018-08-13 20:46 湮天霸神666 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调用和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。 一、五类共享数据 1、不可变 不可变的对象一定是线程安全的,不需要再采取任何的线程安全保障 阅读全文
posted @ 2018-08-13 20:42 湮天霸神666 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 一、线程的实现 线程是比进程更轻量级的调度执行单位,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。 线程的实现主要有如下3种方式: 1)使用内核线程实现 内核线程(KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操 阅读全文
posted @ 2018-08-13 20:39 湮天霸神666 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 一、Java内存模型(JMM) Java内存模型是为了定义虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量是指实例字段、静态字段和构成数组对象的元素,不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然不会存在竞争问题。 Java内存模型规定了所有的变量都存储在主内存 阅读全文
posted @ 2018-08-13 20:37 湮天霸神666 阅读(178) 评论(0) 推荐(0) 编辑