
线程
北方散人
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
UnSafeThread 并发编程线程不安全示例
下面图片的运行结果是1000但是如果不用CountDownLatch&& while(true){if (countDownLatch.getCount() == 0){直接打印num++的话,运行结果就是0,因为线程虽以创建,但是下面主线程的代码会先执行。2....原创 2019-03-04 23:41:11 · 364 阅读 · 0 评论 -
如何避免线程安全性问题
A.线程安全性问题成因1.多线程环境2.多个线程操作同一共享资源3.对该共享资源进行了非原子性操作B.如何避免打破成因中三点任意一点1:多线程环境–将多线程改单线程(必要的代码,加锁访问)2:多个线程操作同一共享资源–不共享资源(ThreadLocal,不共享,操作无状态化,不可变)3:对该共享资源进行了非原子性操作-- 将非原子性操作改成原子性操作...原创 2019-03-17 14:57:01 · 588 阅读 · 0 评论 -
锁的分类
1.自旋锁:线程状态及上下文切换消耗系统资源,当访问共享资源的时间短,频繁的上下文切换不值得。jvm实现,使线程在没有获得锁的时候,不被挂起,转而执行空循环,循环几次之后,如果还没能获得锁,则被挂起。2.阻塞锁:阻塞所改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或者时间)时,才可以进入线程的准备就绪状态,转为就绪状态的所有线程,通过竞争,进入运行状态。3.重入锁:支...原创 2019-03-17 16:38:16 · 673 阅读 · 0 评论 -
lock的使用
1.lock的使用上锁用lock()方法,解锁用unlock()方法。2.lock与synchronized的区别lock获取锁与释放锁的过程,都需要手动的控制lock用的是乐观锁方式,所谓的乐观锁就是,每次不加锁而是假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁的实现机制就是CAS操作。synchronized托管给jvm执行原始采用的是CPU悲观锁机制...原创 2019-03-17 17:26:08 · 184 阅读 · 0 评论 -
公平锁和非公平锁的区别
1.公平锁:顾名思义–公平,大家老老实实排队。2.非公平锁:只要有机会就尝试抢占资源3.非公平锁的弊端:可能导致后面排队等待的线程等不到相应的CPU资源,从而引起线程饥饿。...原创 2019-03-17 22:46:03 · 3151 阅读 · 0 评论 -
idea多线程debug
当ReentrantLockDebugDemo.java 这个类中的main函数创建了多个线程之后,我们可以按照如下设置控制每个线程,否则多个线程控制一个时,其它的都运行完了,1处是设置多个线程debug时,设置所有的线程都在debug队列中。2处是选择debug的类3.是挂起开始dubug4是针对所有线程5.是确认修改6处可以选择具体的哪个线程。...原创 2019-03-18 21:55:15 · 393 阅读 · 0 评论 -
读写锁特性及ReentrantReadWriteLock的使用
特性:写写互斥、读写互斥,读读共享所降级:写线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性。...原创 2019-03-18 23:09:59 · 135 阅读 · 0 评论 -
ThreadLocal的使用
线程变量,是一个以ThreadLocal对象为键,任意对象为值得存储结构。为每个线程单独存放一份变量副本,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。只要线程处于活动状态并且TreadLocal实例可以访问,那么每个线程都拥有对其本地线程副本的隐式引用变量一个线程消失后,它的所有副本线程局部实例受垃圾回收(除非其他存在对这些副本的引用)一般用的比较多的...原创 2019-04-01 00:24:15 · 196 阅读 · 0 评论 -
为什么要使用线程池
诸如WEB服务器,数据库服务器,文件服务器或者邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如HTTP,FTP)通过JMS队列或者可能通过轮询数据库。不管请求如何到达,服务器应用程序经常出现的情况是:单个任务处理的时间很短而请求的数目是巨大的。每当一个请求到达就创建一个新线程,然后在新线程中为请求服务,但是频繁的创建...原创 2019-04-23 23:30:57 · 193 阅读 · 0 评论 -
Callable与Runnable
/**Callable与Runnable功能相似,Callable的call有返回值可以返回给客户端,而Runnable没有返回值,一般情况下,Callable与FutureTask一起使用,或者通过线程池的submit方法返回相应的FutureFuture就是对于具体的Runnable或者Callable任务的执行结果进行取消,查询是否完成,获取结果,设置结果操作。get方法会阻塞...原创 2019-05-14 01:33:57 · 958 阅读 · 0 评论 -
线程池核心组成部分及运行机制
corePoolSize:核心线程池大小 cSize,不初始化默认是0个maxinumPoolsSize:线程池最大容量 mSizekeepAliveTime:当线程数量大于核心时,多余的空闲线程在终止之前等待新任务的最大时间。unit:时间单位workQueue:工作队列 nWorksThreadFactory:线程工厂handler:拒绝策略运行机制通过new 创建线程池时,除...原创 2019-05-16 00:30:12 · 883 阅读 · 0 评论 -
线程池自定义拒绝策略
1.拒绝策略类2.main测试主类原创 2019-05-26 16:57:11 · 532 阅读 · 0 评论 -
Excutor框架
通过相应的方法,能创建出6种线程池1.ExecutoirService executorService1 = Exectors.newCachedThreadPool();创建一个可以根据需要创建新线程的线程池,如果有空闲线程,优先使用空闲的线程。2.ExecutoirService executorService2 = Exectors.newFixedThreadPool(2);创建一...原创 2019-05-26 18:22:06 · 374 阅读 · 0 评论 -
idea生成堆栈文件
2.3.4.必须保存一下5.一直不停的创建任务,超过设置的值6.在E:\neicunfenxi生成一个内存分析的配置文件7.分析这个配置文件heapanalyzer8.下载的jar包点击运行,点击接受9.选择文件加载10.分析得出98%的内存被该队列用了。...原创 2019-05-27 00:33:37 · 4297 阅读 · 2 评论 -
懒汉式线程安全分析
实际操作的时候懒汉式getInstance中进行两次判null和synchronized* 并不能完全保证线程安全,因为它不能防止指令重排序** 所以要在下面的声明是加上volatiel防止指令重排序...原创 2019-03-17 13:45:49 · 176 阅读 · 0 评论 -
Volatile关键字的使用
能且仅能修饰变量保证该变量的可见性,volatile关键字仅仅保证可见性,并不保证原子性 禁止指令重排序A、B两个线程同时读取volatile关键字修饰的对象A读取之后,修改了变量的值修改后的值,对B线程来说,是可见使用场景1.作为线程的开关2.单利,修饰对象实例,禁止指令重排序。...原创 2019-03-17 12:39:27 · 164 阅读 · 0 评论 -
线程的两种创建方式
1.集成Thread,并重写父类的run方法2.实现Runnable接口原创 2019-03-04 23:46:05 · 128 阅读 · 0 评论 -
线程的run方法执行后的效果(及run方法与start方法的区别)
只有调用线程的start()方法才会启动线程,例如,下面的没有调用start()方法,而只是调用了run()方法,运行后打印的线程的名称是主线程的名称。run方法与start方法的区别1 java中多线程有两个常见的方法start方法和run方法。正常来说run方法是多线程的线程体。2 创建线程,可以使用extends Thread和implements Runnable如:publi...原创 2019-03-04 23:53:11 · 823 阅读 · 0 评论 -
模拟线程的死锁 && 该线程堆栈的分析
public class DeadLuckDemo {private static final Object HAIR_A = new Object();private static final Object HAIR_B = new Object();/** * 线程死锁 * @param args */public static void main(String[] arg...原创 2019-03-02 21:01:12 · 221 阅读 · 0 评论 -
CountDownLatch共享锁实现原理
CountDownLatch共享锁实现原理2018年05月14日 11:48:09 带带大师兄- 阅读数:87CountDownLatch使用解说CountDownLatch是java5中新增的一个并发工具类,其使用非常简单,下面通过伪代码简单看一下使用方式:这里写图片描述这是一个使用CountDownLatch非常简单的例子,创建的时候,需要指定一个初始状态值,本例为2,主线程调用 l...转载 2019-03-03 16:21:08 · 242 阅读 · 0 评论 -
线程的原子性操作
1.原子性操作:一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。2.如何把非原子性操作变成原子性给执行的方法加上synchronized或者锁等 ,让其依次执行。...原创 2019-03-13 22:40:31 · 211 阅读 · 0 评论 -
synchronized
1.内置锁每个java对象都可以做一个实现同步的锁,这些锁称为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。2.互斥锁内置锁是一个互斥锁,这就意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,直到线程B释放这个锁,如果B线程不释放这个锁,那么A线...原创 2019-03-14 00:18:07 · 199 阅读 · 0 评论 -
lambda表达式创建 && 线程池创建线程 &&线程
1.lambda表达式创建线程2.匿名内部类创建线程注意为调用start的方法,下图只是参考不准3.使用线程池创建一个线程在这里插入代码片原创 2019-03-10 19:46:11 · 1198 阅读 · 0 评论 -
线程的挂起与恢复suspend()&&reusume()
1.什么是线程挂起,线程挂起操作实质上就是线程进入到“”非可执行“”状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运行。在线程挂起后,可以通过重新唤醒线程来使之恢复运行2.为什么要挂起线程CPU分配的时间片非常短,同时也是非常珍贵,避免资源的浪费3.如何挂起线程thread.suspend();(被废弃的方法,容易造成死锁所以被废弃,并且挂起不会释放该线...原创 2019-03-10 21:01:30 · 262 阅读 · 0 评论 -
模拟死锁(suspend)
1.正常的场景,正常的执行完毕2.死锁的状态下图中控制台输出的内容只有三行这是因为1处执行start()之后,接着2处的resume()释放锁先执行了,3处的挂起线程最后执行了,所以导致了死锁;2和3执行顺序的不确定性,导致执行结果可能是死锁...原创 2019-03-10 21:52:35 · 304 阅读 · 0 评论 -
线程wait()和notify(),notifyall()使线程处于挂起状态 和唤醒线程
名词解释A.wait():暂停执行、放弃已经获得的锁,进入等待状态;notify():随机唤醒一个在等待锁的线程;notfyall():唤醒所有在等待锁的线程,自行抢占cpu资源;适合使用线程挂起:等待某些没有就绪的资源1.如下图所示,使用锁waitObject,则也要用waitObject调wait()和notify&&notifyall()方法下面的执行结果表明 ...原创 2019-03-10 23:41:18 · 921 阅读 · 0 评论 -
线程的优先级setPriority
1.线程的优先级告诉程序该线程的重要程度有多大。如果有大量的线程都被阻塞,都在等候运行,程序会尽可能地先运行优先级高的那个线程。但是,这并不表示优先级较低的线程不会运行。若线程的优先级较低,只不过表示它被准许运行的机会小一些而已。2.现成的优先级设置可以为1-10的任意数值,Thread类中定义了三个线程优先级,分别是:MIN_PRIORITY(1),NORM_PRIORITY(5)(默认值),...原创 2019-03-11 21:07:54 · 349 阅读 · 0 评论 -
守护线程
1.线程的分类《1》. 用户线程:即普通的线程《2》. 守护线程:任何一个守护线程都是整个程序中所有用户线程的守护者,只要有活着的用户线程,守护线程就活着。当JVM实例中最后一个非守护线程结束时,也岁JVM一起退出。2.守护线程的用处:JVM垃圾清理线程3.建议:尽量少使用守护线程,因其不可控不要在守护线程里去进行读写操作,执行计算逻辑test示例两秒之后守护线程随着用户线程的执行...原创 2019-03-11 22:21:10 · 148 阅读 · 0 评论 -
线程的安全性问题
1.什么是线程安全性?当多个线程访问某个类,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类为线程安全的。–《并发编程实战》2.线程不安全多线程并发访问时,得不到正确的结果例如:https://mp.csdn.net/mdeditor/88146879#3.从字节码的角度分析线程不安全的原因...原创 2019-03-11 23:07:30 · 225 阅读 · 0 评论 -
线程池的使用建议
一.尽量避免使用Executor框架创建的线程池newFixedThreadPool newSingleThreadExcutor允许的请求最大队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。newCachedThreadPool newSchduledThreadPool允许创建的线程池数量为Integer.Max_VALUE,可能会创建大量的线程,从...原创 2019-07-12 00:36:54 · 165 阅读 · 0 评论