
线程
痴人痴笑
这个作者很懒,什么都没留下…
展开
-
Lock体系
synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,用**unlock()**方法释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。原理:AQS–独占锁防止死锁1.AbstractQueuedSynchronizer(AQS) 队列式同步器作用:处理线程 锁的获取与释放.原理:双端队列+CAS.3.通信机制—ConditionObject的原创 2020-07-07 17:06:28 · 417 阅读 · 0 评论 -
Callable实现多线程
线程执行完成后会返回一个结果.Future可以拿到异步执行任务的返回值通过 get() 方法可以阻塞当前线程,并获取对象的返回值.FutureTask实现了两个接口,Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值,...原创 2020-07-06 18:28:05 · 256 阅读 · 0 评论 -
synchronized底层原理 及 优化方案
1.对象锁 (monitor) 机制执行同步代码块时首先要执行 monitorenter 指令,退出同步代码块时要执行 monitorexit 指令.所以 使用Synchronized进行同步,其关键就是必须要对对象的监视器monitor进行获取,当线程获取monitor后才能继续往下执行,否则就只能等待。而这个获取的过程是互斥的,即同一时刻只有一个线程能够获取到monitor。一个monitorenter指令以及多个monitorexit指令。确保所获得的锁在正常执行路径,以及异常执行路径上都能够被原创 2020-07-05 11:52:34 · 273 阅读 · 0 评论 -
CAS机制
1.1 乐观锁 vs 悲观锁乐观锁:乐观锁假设认为数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正式对数据是否产生并发冲突进行检测,如果发现并发冲突了,则让返回用户错误的信息,让用户决定如何去做。悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。1.2 CAScompare and swap :比较并交换多个线程都拷贝主内存的值到自己的工作内存,当修改后写回主内存时,会和原来拷贝时的进行原创 2020-07-04 20:43:17 · 243 阅读 · 0 评论 -
java多线程----定时器
1.定时任务线程ScheduledExecutorServiceclass MyScheduledThreadPool { public static void main(String[] args) { //给定大小的线程数 ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10); System.out.println(new Date());原创 2020-06-06 22:23:57 · 230 阅读 · 0 评论 -
java多线程案例----阻塞式队列
阻塞队列 当队列里面没有值时,会阻塞直到有值输入。当队列满的时候,会阻塞输入,直到队列有值输出一,自己实现阻塞队列生产者消费者模型生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。public class MyB原创 2020-06-05 14:57:13 · 307 阅读 · 0 评论 -
单例模式---饿汉模式和懒汉模式
单例模式就是保证类在内存中只有一个对象1)控制类的创建,不让其他类创建本类的对象,即需要设置private属性2)在本类中定义一个本类的对象public class test { public static void main(String[] args) { //分别实例化对象 s1,s2 Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.pri原创 2020-06-04 16:45:15 · 337 阅读 · 2 评论 -
线程--中断(interruput),等待线程结束(join),休眠(sleep)
1.线程中断(1)通过thread 对象调用 interrupt 方法通知线程中断.(2). thread 收到通知的方式有两种:如果线程调用了 wait/join/sleep 等方法而阻塞挂起,则以 InterruptedException 异常的形式通知,清除中断标志否则,只是内部的一个中断标志被设置,thread 可以通过(设置中断标志:true; 清除中断标志:false)①. Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志② Thread.c原创 2020-06-03 17:56:41 · 502 阅读 · 0 评论 -
java多线程-----通信(wait,notify)
多个线程并发执行时,CPU是随即切换线程的,为了满足一定要求,就需要使用线程通信.1.wait方法作用:使当前线程停止运行,处于等待(阻塞)状态,并释放其持有的对象锁,wait方法是Object类的方法,调用wait方法,使线程停止在wait()代码行,直到接到通知或被中断为止.2.notify和notifyAll其他线程调用此对象的 notify 或 notifyAll ,则唤醒当前对象上等待的线程继续运行,即 重新竞争对象锁.notify:随即通知一个等待的线程,notifAll:通知所有原创 2020-06-02 14:53:16 · 230 阅读 · 0 评论 -
java 线程池
线程池最大的好处就是减少线程每次启动和销毁的损耗.原创 2020-05-31 10:13:02 · 203 阅读 · 0 评论 -
解决线程不安全问题(synchronized和volatile)
1.synchronized.当线程释放锁时,JMM会把该线程对应的工作内存中的共享变量刷新到主内存中.当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取共享变量synchronized用的锁是存在Java对象头里的。解决多个线程访问时出现互相干扰的问题,被synchronized修饰的方法或代码块,在同一时刻,只会有一个 获得锁 的线程执行操作,其他线程都处于阻塞状态.具体:1.修饰实例方法调用实例方法就要创建一个对应的对象,锁的也就原创 2020-05-22 13:55:05 · 367 阅读 · 0 评论 -
线程不安全原因(原子性,可见性,代码顺序性)
概念线程安全:多线程访问时,采用加锁机制,一个线程访问一个数据时,进行保护,其他线程不得进行访问该数据 知道该线程读取完成.不会出现数据不一致或数据污染. 通俗来说: 多线程环境下运行的程序结果符合我们的预期要求,即 在单线程下的结果.那么这个程序就是线程安全的.线程不安全:不提供数据保护,多个线程先后对数据进行更改会出现脏数据.影响线程不安全的原因(1)原子性操作不可分割性,比如:a++操作是分为3步的①读取a的值②a的值+1③将更新后的值赋予a. 如果一个线程正在执行时,中途插入了其他线程,原创 2020-05-20 16:49:08 · 449 阅读 · 0 评论 -
线程基本概念[java]
线程是系统调度的最小单位线程可以理解成是在进程中独立运行的子任务。举例说明:比如QQ.exe运行时就会有很多的子任务在同时运行。比如,好友视频线程、下载文件线程、传输数据线程、发送表情线程等。这些不同的任务或者说功能都可以同时运行,其中每一个任务完全可以理解成是“线程”在工作,传文件、听音乐、发送图片表情等功能都有对应的线程在运行。1.线程的创建(1)继承Thread;(2)实现Runnable接口;通过实现 Runnable 接口,并且调用 Thread 的构造方法时将 Runnable 对象作原创 2020-05-18 16:50:45 · 244 阅读 · 0 评论 -
进程详细内容
1.进程的初步认识.对于操作系统来说,一个任务就是一个进程.课本概念:程序的一个执行实例,正在执行的程序等.内核观点:担当分配系统资源(CPU的时间,内存)的实体,原创 2020-05-16 10:52:01 · 464 阅读 · 0 评论