并发,线程
weixin_43115433
这个作者很懒,什么都没留下…
展开
-
happen before
先行发生原则(Happens-Before)是判断数据是否存在竞争、线程是否安全的主要依据。先行发生是Java内存,模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,那么操作A产生的影响能够被操作B观察到。 口诀:如果两个操作之间具有happen-before关系,那么前一个操作的结果就会对后面的一个操作可见。是Java内存模型中定义的两个操作之间的偏序关系。 常见的happen-b...原创 2019-07-04 20:18:30 · 369 阅读 · 0 评论 -
java中的线程池实现有哪些?FixedThreadPool底层使用的是什么任务队列
四种线程池: 1.newFixedThreadPool()方法:该方法返回一个固定线程数量的线程池。线程池中的线程数量始终不变,当新任务提交若有空闲线程则立即执行,没有,则新的任务会暂存在一个任务队列中,待有线程空闲时,便处理任务队列中的任务。 2.newSingleThreadExecutor()方法:该方法返回一个只有一个线程的线程池。该任务队列是一个先进先出的顺序执行队列。 3.newCac...原创 2019-09-08 10:33:17 · 530 阅读 · 0 评论 -
java中synchronize代码块的实现,以及jdk1.6对锁的优化,锁升级
被sunchronized关键字修饰的代码块在被编译成代码块的时候,会在代码块的开始和结束插入monitorenter和moniterexit指令。任何对象都有一个monitor与之关联,而且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获得对象所对应的monitor的所有权,即尝试获得对象的锁。虚拟机在执行这两个指令时会检查对象的锁状态是否为空或...原创 2019-09-08 09:53:59 · 418 阅读 · 0 评论 -
java中synchroize和lock的区别使用场景
1.lock可以使用Condition进行线程之间的调度 Synchronized则使用Object对象本身的notify,wait,nitityall调度 Condition有更好的灵活性,而且一个lock对象可以有多个Condition,从而可以有选择性的调度线程,更加灵活。而synchronized只能针对同一个对象,所有线程都注册在它身上,线程的调度没有选择权,会出现很大的问题 2.loc...原创 2019-09-08 08:37:26 · 451 阅读 · 1 评论 -
java中Reentrantlock的使用场景
1.在并发量和高的情况下 主要是防止资源使用冲突,保证同一时间内只有一个操作可以使用该资源。 但与synchronized的明显区别是性能优势(伴随jvm的优化这个差距在减小)。同时Lock有更灵活的锁定方式,公平锁与不公平锁,而synchronized永远是非公平的。 2.如果发现该操作已经在执行中则不再执行(有状态执行) 例如:用在定时任务时,如果任务执行时间可能超过下次计划执行时间,确保该有...原创 2019-09-06 09:08:16 · 854 阅读 · 0 评论 -
介绍一下Reentrantlock
Reentrantlock是java.util.concurrent.lcoks中的可重入锁,在高竞争下有更好的性能,且可以中断。Reentrantlcok是基于AQS实现的。AQS是基于FIFO队列实现的,整个AQS是典型的模板模式的应用,设计的十分精巧,对于FIFO队列的各种操作在AQS中已经实现,AQS的子类一般只需要重写tryacquire(int arg)和tryrelease(int ...原创 2019-09-06 08:38:12 · 112 阅读 · 0 评论 -
介绍一下condition
coditon的await,signal和Object的wait,notify方法类似,只是wait和notify是与synchronized配合使用,而condition是与重入锁相关联的。通过lock接口的 condition newcondition()方法可以生辰一个与当前重入锁绑定的condition实例。当condition执行wait后会放开锁,而如果要唤醒它,除了要执行signal...原创 2019-09-04 21:24:51 · 185 阅读 · 0 评论 -
介绍一下AbstractQueueSynchronizer
AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架。 AQS为一系列同步器依赖于一个单独的原子变量(state)的同步器提供了一个非常有用的基础。子类们必须定义改变state变量的protected方法,这些方法定义了state是如何被获取或释放的。假定这些条件后,此类中的其他方法就可以实现所有队列和阻塞机制。AQS同时提供了两种模式互斥模式和共享模式,互斥模式的应用:Reent...原创 2019-09-04 21:09:48 · 86 阅读 · 0 评论 -
启动线程时start和run的区别是什么
1.start()方法:用来启动线程,实现了多线程的运行,通过调用Tread类的start方法来启动一个线程,这时此线程处于就绪态,没有运行,当此条线程得到了cpu的时间片,就开始执行run方法,这里的run方法称为线程体,他包含了要执行这个线程的内容,run方法运行结束,线程终止。 2.run方法就是一个普通的方法,如果直接调用run方法,他仅仅在主线程这条线程中执行。程序仍然顺序执行,执行完r...原创 2019-09-04 20:11:07 · 150 阅读 · 0 评论 -
java中如何创建线程的
java创建线程的四种方式: 1.继承thread 2.实现Runnable 实现接口可以避免单继承的局限,此时子类负责真实的业务操作,thread负责资源调度与线程创建辅助真实业务。Runnable任务也可在Executors中或者ExecutorService提交运行 3.线程池 不用的线程池针对不同的需求 4.实现callable Callable与Runnable Cal...原创 2019-09-04 20:02:50 · 94 阅读 · 0 评论 -
用java实现生产者消费者的三种方法
1,使用norify和wait 生产者会判断如果仓库已满则会wait,而消费者在消费之后会有一个notify提醒生产者。同理消费者会判断,如果仓库为空则会wait,而生产者在生产一个之后会notify 2.使用await和signal 原里和1差不多,只不过用的是lock和condition,而上边用的是synchronized和Object 3.使用阻塞队列 参考博客:https://www.c...原创 2019-09-04 19:09:24 · 184 阅读 · 0 评论 -
死锁是如何产生的以及四个必要条件
死锁产生的原因: 1.对共享资源的竞争 2.进程的推进顺序不当 死锁产生的四个必要条件: ● 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。 ● 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资...原创 2019-09-04 18:54:50 · 78 阅读 · 0 评论 -
synchronized和volatile的区别
volatile本(可见性和禁止指令重排)质volatile变量在每次被线程访问时,都强迫从主内存中重读该变量的值,而当该变量发生变化时,又会强迫线程将最新的值刷新到主内存,这样任何时刻,不同的线程总能看到该变量的最新值。,synchronized则是锁定当前变量。只有当前线程可以访问该变量,其他线程被线程阻塞住 volatile不会造成线程阻塞而synchronized会造成 volatile仅...原创 2019-09-04 18:35:40 · 128 阅读 · 0 评论 -
JAVA线程中的同步方式有哪些
1.同步方法,既有synchronized关键字修饰的方法 2.同步代码块,synchronized关键字修饰的语句块 3.特殊域变量violatile实现的同步 4.使用reetranlock实现的线程同步 5使用局部变量实现线程同步,如果使用threadloca管理变量,则每一个使用该变量的线程都获得该变量的一个副本,副本之间相互独立,这样每一个线程都可以所以修改自己的变量副本,而不会对其他线...原创 2019-09-01 19:25:18 · 128 阅读 · 0 评论 -
简述为什么会出现锁的机制
java允许多线程并发控制,当多个线程同时操作一个共享资源变量时,(如数据的增删改查) 将会对导致数据出现不正确的结果,相互之间产生冲突,因此需要加入锁保证该变量的唯一和准确性。 ...原创 2019-08-31 14:53:57 · 212 阅读 · 0 评论 -
java线程有几种状态?什么状态是阻塞状态
1.新建状态 2.就绪状态 3.运行状态 4.阻塞状态(等待阻塞,同步阻塞,其他阻塞) 5.死亡状态原创 2019-09-08 10:36:34 · 1266 阅读 · 0 评论