- 博客(13)
- 收藏
- 关注
原创 CountDownLatch
CountDownLatch 是通过一个计数器来实现的, 计数器的初始值为初始任务的数量。 每当完成了一个任务后, 计数器的值就会减 1(CountDownLatch.countDown()方法) 。 当计数器值到达 0 时, 它表示所有的已经完成了任务, 然后在闭锁上等待 CountDownLatch.await()方法的线程就可以恢复执行任务。应用场景:实现最大的并行性:有时我们想...
2020-03-03 16:26:11
93
原创 线程的并发工具类Fork-Join
快速排序,归并排序,二分查找属于分而治之。分治法的设计思想是:将一个难以直接解决的大问题,分豁成一些规模较小的相同问题,以便各个击破,分而治之。通常我们不直接继承ForkjoinTask类,只需要直接继承其子类。(1.RecursiveAction用于没有返回结果的任务,2.RecursiveTask用于有返回值的任务)task要通过ForkJoinPool来执行,使用submi...
2020-03-03 16:21:10
178
原创 调用 yield() 、 sleep()、 wait()、 notify()等方法对锁有何影响?
yield() 、 sleep()被调用后, 都不会释放当前线程所持有的锁。调用 wait()方法后, 会释放当前线程持有的锁, 而且当前被唤醒后, 会重新去竞争锁, 锁竞争到后才会执行 wait 方法后面的代码。调用 notify()系列方法后, 对锁无影响, 线程只有在 syn 同步代码执行完后才会自然而然的释放锁, 所以 notify()系列方法一般都是 syn 同步代码的最后一行。...
2020-03-03 16:04:22
189
原创 线程间的协作等待/通知机制(notify/notifyAll,wait)
是指一个线程 A 调用了对象 O 的 wait()方法进入等待状态, 而另一个线程 B调用了对象 O 的 notify()或者 notifyAll()方法,线程 A 收到通知后从对象 O 的 wait()方法返回, 进而执行后续操作。 上述两个线程通过对象 O 来完成交互, 而对象上的 wait()和 notify/notifyAll()的关系就如同开关信号一样, 用来完成等待方和通知方之...
2020-03-01 18:59:11
258
原创 ThreadLocal 辨析
ThreadLocal 为每个线程都提供了变量的副本, 使得每个线程在某一时间訪问到的并非同一个对象, 这样就隔离了多个线程对数据的数据共享。Spring 的事务就借助了 ThreadLocal 类。Spring 会从数据库连接池中获得一个connection, 然会connection 放进 ThreadLocal 中, 也就和线程绑定了, 事务需要提交或者回滚, 只要从 ThreadLo...
2020-03-01 18:55:15
111
原创 volatile 保证了不同线程对这个变量进行操作时的可见性
即一个线程修改了某个变量的值, 这新值对其他线程来说是立即可见的。不加 volatile 时, 子线程无法感知主线程修改了 ready 的值, 从而不会退出循环,而加了 volatile 后, 子线程可以感知主线程修改了 ready 的值, 迅速退出循环。...
2020-03-01 18:11:12
281
原创 synchronized 内置锁
关键字synchronized 可以修饰方法或者以同步块的形式来进行使用, 它主要确保多个线程在同一个时刻, 只能有一个线程处于方法或者同步块中, 它保证了线程对变量访问的可见性和排他性, 又称为内置锁机制对象锁和类锁:对象锁是用于对象实例方法, 或者一个对象实例上的, 类锁是用于类的静态方法或者一个类的 class 对象上的。 我们知道, 类的对象实例可以有很多个, 但是每个类只有一...
2020-03-01 17:59:19
91
原创 线程的yield(),join()方法以及守护(Daemon)线程
yield()方法: 使当前线程让出 CPU 占有权,不会释放锁资源。join()方法: 把指定的线程加入到当前线程, 可以将两个交替执行的线程合并为顺序执行。比如在线程 B 中调用了线程 A 的 Join()方法, 直到线程 A 执行完毕后, 才会继续执行线程 B。Daemon 线程被用作完成支持性工作, 但是在 Java 虚拟机退出时 Daemon 线程中的 finally 块并不...
2020-03-01 17:14:43
109
原创 深入理解线程的 run()和 start()
start()方法让一个线程进入就绪队列等待分配 cpu, 分到 cpu 后才调用实现的 run()方法, start()方法不能重复调用, 如果重复调用会抛出异常。而 run 方法是业务逻辑实现的地方, 本质上和任意一个类的任意一个成员方法并没有任何区别, 可以重复执行, 也可以被单独调用。...
2020-03-01 16:53:54
234
原创 如线程调用了 thread.sleep、 thread.join、 thread.wait 等
如果一个线程处于了阻塞状态(如线程调用了 thread.sleep、 thread.join、thread.wait 等) , 则线程在检查中断标示时如果发现中断标示为 true, 则会在这些阻塞方法调用处抛出 InterruptedException 异常, 并且在抛出异常后会立即将线程的中断标示位清除, 即重新设置为 false。...
2020-03-01 16:48:44
188
原创 JAVA中interrupt(),isInterrupted(),interrupted()都怎么使用?
1.调用线程的interrupt()方法对其进行中断操作,不代表线程会立即停止工作,同样线程也可以不理会这种中断请求,因为java中的线程是协作式,不是抢占式的。2.线程通过方法 isInterrupted()来进行判断是否被中断, 也可以调用静态方法Thread.interrupted()来进行判断当前线程是否被中断, 不过 Thread.interrupted()会同时将中断标识位改写为 ...
2020-03-01 16:40:19
332
原创 JAVA有几种新启线程的方式?
答:两种1.类Thread2.接口Runnablejava对线程的抽象Thread ,Runnable对任务的抽象
2020-03-01 13:22:05
341
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人