随笔分类 -  java多线程

摘要:可重入锁概念: 当一个线程得到一个对象锁后,再次请求此对象时时可以再次得到该对象的锁的,这也证明synchronized方法/块的内部调用本类的其他synchronized方法/块时,时永远可以得到锁的。 输出结果如下: 运行结果说明: 自己可以再次获取自己的内部锁。比如有一条线程获得了某个对象多的 阅读全文
posted @ 2019-10-28 17:41 劈天造陆 阅读(892) 评论(0) 推荐(0)
摘要:可重入锁又称递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提是锁对象必须是同一对象或者class), 不会因为之前已经获取过还没实方而发生阻塞。即同一线程可执行多个持有同一个锁的方法。 先来一段代码: 就像一个多用充电线可以同时给多部iphone充电,但是不会 阅读全文
posted @ 2019-09-17 10:35 劈天造陆 阅读(2549) 评论(0) 推荐(0)
摘要:工作中常用线程池的(通过Executors)创建方法分为以下四种: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列 阅读全文
posted @ 2019-04-30 09:46 劈天造陆 阅读(467) 评论(0) 推荐(0)
摘要:synchronized和RetreenLock锁区别 1、synchronized是java关键字,RetreenLock是个java类 2、synchronized无法获取锁状态,Lock可以判断是否持有锁 3、synchronized会自动释放锁,Lock需要在finally中unlock() 阅读全文
posted @ 2019-04-29 18:18 劈天造陆 阅读(4266) 评论(2) 推荐(0)
摘要:什么是死锁? 由于两个或者多个线程互相持有对方所需要的资源,导致线程处于等待状态,造成死锁。 为什么会产生死锁(为什么会互相占用对方的资源) 因为系统资源不足。 进程运行推进的顺序不合适。 资源分配不当等。 产生死锁的四个必要条件 互斥条件:一个资源每次只能被一个进程使用。 请求与保持条件:一个进程 阅读全文
posted @ 2019-04-29 18:11 劈天造陆 阅读(1309) 评论(0) 推荐(0)
摘要:1. 背景 ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。 ThreadLocal非常适合对Java多线程编程感兴趣的程序员作为入门类阅读,原因 阅读全文
posted @ 2018-10-11 11:45 劈天造陆 阅读(385) 评论(0) 推荐(2)
摘要:Runnable和Callable之间的区别 1、Runnable任务执行后没有返回值;Callable任务执行后可以获得返回值 2、Runnable的方法是run(),没有返回值;Callable的方法是call(),有返回值 3、Runnable的run()方法不能抛异常,有异常的话只能在run 阅读全文
posted @ 2018-09-14 15:20 劈天造陆 阅读(3323) 评论(0) 推荐(0)
摘要:我们先看以下代码,不用ThreadLocal会发生什么情况 控制台输出了这么一个异常 很明显是异常出现在线程上,表明这样做是线程不安全的 下面,我们用ThreadLocal,代码如下: 控制台,正常输出,没有异常出现,表明线程安全。 我们分析一下ThreadLocal的实现原理: 阅读全文
posted @ 2018-04-19 16:03 劈天造陆 阅读(204) 评论(0) 推荐(0)
摘要:大家可以看一下join()方法的源码 所以,从源码可以看出,主线程中调用了ThreadA的join()方法,则相当于调用了ThreadA的wait()方法, 当ThreadA线程执行完后会调用自身的notifyAll()方法唤醒主线程,从而达到了同步的目的 阅读全文
posted @ 2018-04-18 10:58 劈天造陆 阅读(325) 评论(0) 推荐(0)
摘要:最近做项目,使用到了FutureTask和主线程并发,应用到实际中还是挺实用的,特在此总结一下。 有不对之处,忘各位多多指出。 20-26行创建一个任务MyTaskA,实现的是Callable,主要是为了获取返回值(关于如何创建线程,这里就不在赘述); 11行创建FutureTask; 12行启动线 阅读全文
posted @ 2018-03-28 16:05 劈天造陆 阅读(881) 评论(0) 推荐(0)
摘要:使用scheduleAtFixedRate()方法调度任务,输出如下: 使用scheduleWithFixedDelay()方法调度任务,输出如下: 阅读全文
posted @ 2018-01-24 14:38 劈天造陆 阅读(349) 评论(0) 推荐(0)
摘要:newFixedThreadPool()方法: 该方法返回一个固定数量的线程池,当一个新的任务提交时,线程池中若有空闲线程,则立即执行。 若没有。则新的任务被暂存在一个任务队列中,待线程空闲时,便处理在任务队列中的任务 newCachedThreadPool()方法: 该方法返回一个可根据实际情况调 阅读全文
posted @ 2018-01-24 14:32 劈天造陆 阅读(387) 评论(0) 推荐(0)
摘要:package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class C... 阅读全文
posted @ 2018-01-23 16:02 劈天造陆 阅读(307) 评论(0) 推荐(0)
摘要:package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLo... 阅读全文
posted @ 2018-01-23 15:41 劈天造陆 阅读(206) 评论(0) 推荐(1)
摘要:package com.thread.test; public class BadLockOnInteger implements Runnable { public static Integer i = 0;// Integer属于不变对象,要想改变,只能重新创建对象 static BadLockOnInteger instance = new BadLockOnInte... 阅读全文
posted @ 2018-01-22 10:30 劈天造陆 阅读(378) 评论(0) 推荐(0)
摘要:原子性:是指一个操作是不可中断的。即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 比如,对于一个静态全局变量int i,两个线程同时对它赋值,线程A给他赋值为1,线程B给他赋值为-1。那么不管这两个线程 以何种方式。何种步调工作,i的值要么是1,要么是-1.线程A和线程B之间 阅读全文
posted @ 2018-01-19 14:57 劈天造陆 阅读(9453) 评论(0) 推荐(2)
摘要:执行结果如下 上述代码中开启两个线程T1和T2。T1执行了object.wait()方法,注意在执行wait()方法前T1先申请了object的对象锁,因此在执行obect.wati()时, 它是持有object的对象锁的。wait()方法执行后T1进入等待和状态,并示范object对象锁。T2在执 阅读全文
posted @ 2018-01-19 10:17 劈天造陆 阅读(1352) 评论(0) 推荐(0)
摘要:首先我们要明确,线程中断并不会使线程立即退出,而是发送一个通知,告知目标线程你该退出了,但是后面如何处理,则完全有目标线程自行决定。 这就是和stop()不一样的地方,stop执行后线程会立即终止,这样可能会引起数据不一致的问题(所以stop()方法已经被废弃不推荐使用了)。 线程中断有三个方法 先 阅读全文
posted @ 2018-01-19 09:39 劈天造陆 阅读(980) 评论(0) 推荐(0)
摘要:先上一段代码 本以为运行结果如下: 结果却出现了多种情况,如下: 或者 后翻阅资料得知: Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉, 让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是 阅读全文
posted @ 2018-01-18 14:11 劈天造陆 阅读(44194) 评论(11) 推荐(17)

点击右上角即可分享
微信分享提示