自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 Thread.join()通信及其源码解析

Thread.join通信及其源码浅析线程b去执行修改。只有B运行完成之后,A才能继续操作使用场景:线程A执行到一半,需要一个数据,这个数据需要线程。线程A的run方法里面,调用线程B的join方法,这个时候,线程A会等待线程B运行完成之后,再接着运行。join方法等待该线程终止。等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,...

2019-03-31 23:31:31 198

原创 使用管道流进行线程间的通信

1.管道流进行通信其实就是一个线程取数据,一个线程往里面扔数据。以内存为媒介,用于线程之间的数据传输2.主要有面向字节:【PiopedOutputStream.PipedInputStream】面向字符【PipedReader,PipedWriter】...

2019-03-22 00:19:38 283

原创 生产者和消费者

1.生产者消费模型一般包括:生产者、消费者、中间商2.中间商3.生产者4.消费者5.main函数

2019-03-21 00:11:54 143

原创 线程通信wait、notify、notifyAll

1.何时使用在多线程环境下,有时候一个线程的执行,依赖于另一个线程的某种状态的改变,这个时候,我们就可以使用wait与notify或者notifyAll2.wait跟sleep的区别wait会释放持有的锁,而sleep不会,sleep只会让线程在指定的时间内,不去抢占CPU资源。3.注意点:wait notify必须放在同步代码快中,且必须拥有当前对象的锁,既不能取得A对象的锁,而调用B对...

2019-03-20 01:04:08 127

原创 读写锁特性及ReentrantReadWriteLock的使用

特性:写写互斥、读写互斥,读读共享所降级:写线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性。...

2019-03-18 23:09:59 99

原创 idea多线程debug

当ReentrantLockDebugDemo.java 这个类中的main函数创建了多个线程之后,我们可以按照如下设置控制每个线程,否则多个线程控制一个时,其它的都运行完了,1处是设置多个线程debug时,设置所有的线程都在debug队列中。2处是选择debug的类3.是挂起开始dubug4是针对所有线程5.是确认修改6处可以选择具体的哪个线程。...

2019-03-18 21:55:15 338

原创 公平锁和非公平锁的区别

1.公平锁:顾名思义–公平,大家老老实实排队。2.非公平锁:只要有机会就尝试抢占资源3.非公平锁的弊端:可能导致后面排队等待的线程等不到相应的CPU资源,从而引起线程饥饿。...

2019-03-17 22:46:03 3108

原创 lock的使用

1.lock的使用上锁用lock()方法,解锁用unlock()方法。2.lock与synchronized的区别lock获取锁与释放锁的过程,都需要手动的控制lock用的是乐观锁方式,所谓的乐观锁就是,每次不加锁而是假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁的实现机制就是CAS操作。synchronized托管给jvm执行原始采用的是CPU悲观锁机制...

2019-03-17 17:26:08 153

原创 锁的分类

1.自旋锁:线程状态及上下文切换消耗系统资源,当访问共享资源的时间短,频繁的上下文切换不值得。jvm实现,使线程在没有获得锁的时候,不被挂起,转而执行空循环,循环几次之后,如果还没能获得锁,则被挂起。2.阻塞锁:阻塞所改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或者时间)时,才可以进入线程的准备就绪状态,转为就绪状态的所有线程,通过竞争,进入运行状态。3.重入锁:支...

2019-03-17 16:38:16 613

原创 如何避免线程安全性问题

A.线程安全性问题成因1.多线程环境2.多个线程操作同一共享资源3.对该共享资源进行了非原子性操作B.如何避免打破成因中三点任意一点1:多线程环境–将多线程改单线程(必要的代码,加锁访问)2:多个线程操作同一共享资源–不共享资源(ThreadLocal,不共享,操作无状态化,不可变)3:对该共享资源进行了非原子性操作-- 将非原子性操作改成原子性操作...

2019-03-17 14:57:01 554

原创 懒汉式线程安全分析

实际操作的时候懒汉式getInstance中进行两次判null和synchronized* 并不能完全保证线程安全,因为它不能防止指令重排序** 所以要在下面的声明是加上volatiel防止指令重排序...

2019-03-17 13:45:49 148

原创 Volatile关键字的使用

能且仅能修饰变量保证该变量的可见性,volatile关键字仅仅保证可见性,并不保证原子性 禁止指令重排序A、B两个线程同时读取volatile关键字修饰的对象A读取之后,修改了变量的值修改后的值,对B线程来说,是可见使用场景1.作为线程的开关2.单利,修饰对象实例,禁止指令重排序。...

2019-03-17 12:39:27 125

原创 synchronized

1.内置锁每个java对象都可以做一个实现同步的锁,这些锁称为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。2.互斥锁内置锁是一个互斥锁,这就意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,直到线程B释放这个锁,如果B线程不释放这个锁,那么A线...

2019-03-14 00:18:07 163

原创 线程的原子性操作

1.原子性操作:一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。2.如何把非原子性操作变成原子性给执行的方法加上synchronized或者锁等 ,让其依次执行。...

2019-03-13 22:40:31 177

原创 线程的安全性问题

1.什么是线程安全性?当多个线程访问某个类,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类为线程安全的。–《并发编程实战》2.线程不安全多线程并发访问时,得不到正确的结果例如:https://mp.csdn.net/mdeditor/88146879#3.从字节码的角度分析线程不安全的原因...

2019-03-11 23:07:30 187

原创 守护线程

1.线程的分类《1》. 用户线程:即普通的线程《2》. 守护线程:任何一个守护线程都是整个程序中所有用户线程的守护者,只要有活着的用户线程,守护线程就活着。当JVM实例中最后一个非守护线程结束时,也岁JVM一起退出。2.守护线程的用处:JVM垃圾清理线程3.建议:尽量少使用守护线程,因其不可控不要在守护线程里去进行读写操作,执行计算逻辑test示例两秒之后守护线程随着用户线程的执行...

2019-03-11 22:21:10 113

原创 线程的优先级setPriority

1.线程的优先级告诉程序该线程的重要程度有多大。如果有大量的线程都被阻塞,都在等候运行,程序会尽可能地先运行优先级高的那个线程。但是,这并不表示优先级较低的线程不会运行。若线程的优先级较低,只不过表示它被准许运行的机会小一些而已。2.现成的优先级设置可以为1-10的任意数值,Thread类中定义了三个线程优先级,分别是:MIN_PRIORITY(1),NORM_PRIORITY(5)(默认值),...

2019-03-11 21:07:54 300

原创 线程wait()和notify(),notifyall()使线程处于挂起状态 和唤醒线程

名词解释A.wait():暂停执行、放弃已经获得的锁,进入等待状态;notify():随机唤醒一个在等待锁的线程;notfyall():唤醒所有在等待锁的线程,自行抢占cpu资源;适合使用线程挂起:等待某些没有就绪的资源1.如下图所示,使用锁waitObject,则也要用waitObject调wait()和notify&&notifyall()方法下面的执行结果表明 ...

2019-03-10 23:41:18 873

原创 模拟死锁(suspend)

1.正常的场景,正常的执行完毕2.死锁的状态下图中控制台输出的内容只有三行这是因为1处执行start()之后,接着2处的resume()释放锁先执行了,3处的挂起线程最后执行了,所以导致了死锁;2和3执行顺序的不确定性,导致执行结果可能是死锁...

2019-03-10 21:52:35 265

原创 线程的挂起与恢复suspend()&&reusume()

1.什么是线程挂起,线程挂起操作实质上就是线程进入到“”非可执行“”状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运行。在线程挂起后,可以通过重新唤醒线程来使之恢复运行2.为什么要挂起线程CPU分配的时间片非常短,同时也是非常珍贵,避免资源的浪费3.如何挂起线程thread.suspend();(被废弃的方法,容易造成死锁所以被废弃,并且挂起不会释放该线...

2019-03-10 21:01:30 224

原创 lambda表达式创建 && 线程池创建线程 &&线程

1.lambda表达式创建线程2.匿名内部类创建线程注意为调用start的方法,下图只是参考不准3.使用线程池创建一个线程在这里插入代码片

2019-03-10 19:46:11 1155

原创 线程的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 773

原创 线程的两种创建方式

1.集成Thread,并重写父类的run方法2.实现Runnable接口

2019-03-04 23:46:05 96

原创 UnSafeThread 并发编程线程不安全示例

下面图片的运行结果是1000但是如果不用CountDownLatch&& while(true){if (countDownLatch.getCount() == 0){直接打印num++的话,运行结果就是0,因为线程虽以创建,但是下面主线程的代码会先执行。2....

2019-03-04 23:41:11 324

转载 CountDownLatch共享锁实现原理

CountDownLatch共享锁实现原理2018年05月14日 11:48:09 带带大师兄- 阅读数:87CountDownLatch使用解说CountDownLatch是java5中新增的一个并发工具类,其使用非常简单,下面通过伪代码简单看一下使用方式:这里写图片描述这是一个使用CountDownLatch非常简单的例子,创建的时候,需要指定一个初始状态值,本例为2,主线程调用 l...

2019-03-03 16:21:08 211

原创 模拟线程的死锁 && 该线程堆栈的分析

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 188

原创 idea快捷键

Ctrl+alt+t 快速的捕获异常

2019-03-02 20:57:55 86

BaiduNetdisk.zip

BaiduNetdisk.zip

2023-07-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除