多线程
多线程
車輪の唄
atarik@163.com
展开
-
ThreadLocal与Synchronized的区别
一句话理解ThreadLocal,threadlocl是作为当前线程中属性ThreadLocalMap集合中的某一个Entry的key值Entry(threadlocl,value),虽然不同的线程之间threadlocal这个key值是一样,但是不同的线程所拥有的ThreadLocalMap是独一无二的,也就是不同的线程间同一个ThreadLocal(key)对应存储的值(value)不一样,从而到达了线程间变量隔离的目的,但是在同一个线程中这个value变量地址是一样的。原创 2023-10-27 16:03:59 · 238 阅读 · 0 评论 -
CyclicBarrier
CyclicBarrier用法 字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。 CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器:publicCyclicBarrier(intparties, Runnable ..原创 2020-07-03 21:26:39 · 208 阅读 · 0 评论 -
ScheduledThreadPoolExecutor类
ScheduledThreadPoolExecutor主要用来定期执行任务,或者是在给定的延迟之后运行任务。它的功能与Timer类似,但是比起Timer,ScheduledThreadPoolExecutor功能更强大,使用也更灵活。ScheduledThreadPoolExecutor与Timer区别: Timer对应单个后台线程,所有的任务都由同一个线程调度,因此所有的任务都是串行执...原创 2020-04-03 21:32:07 · 417 阅读 · 0 评论 -
Runable Callable Future
1. Callable与Runable区别Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理。Thread类、Runnable接口和Java内存管理模型使得多线程编程简单直接。但Thread类和Runnable接口都不允许声明检查型异常,也不能定义返回值。没有返回值这点稍微有点麻烦。不能声明抛出检查型异常则更麻烦一些。public void run...原创 2020-01-02 21:52:09 · 181 阅读 · 1 评论 -
wait()和notify()
如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。原创 2017-08-14 16:32:41 · 489 阅读 · 0 评论 -
sleep(1000)和wait(1000)区别
1. sleep()不释放同步锁,wait()释放同步锁2. sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起3. 这两个方法来自不同的类分别是Thread和Object4. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sl原创 2017-10-23 14:38:11 · 1322 阅读 · 0 评论 -
join()方法
public class TestJoin implements Runnable { public static void main(String[] sure) throws InterruptedException { Thread t = new Thread(new TestJoin()); long start = System.curren...原创 2017-08-15 17:02:33 · 628 阅读 · 0 评论 -
实现简单的线程池
public class Pthread extends Thread { private ThreadPool pool; private volatile boolean isShutdown; private Runnable target; public Pthread(Runnable task, ThreadPool pool) {原创 2017-09-20 17:09:46 · 346 阅读 · 0 评论 -
synchronized(this)和synchronized(object)的理解
如果有一块代码(或方法)可能被多个线程同时访问,然后里面操作的数据修改操作可能因为不同线程的操作而不一致的时候,使用synchronized锁定这块代码,确保同时只有一个线程访问这个代码块。也就是说,关键字synchronized可以用在任何类的方法里面,即使该类没有实现Runnable接口或者继承Thread类。使用this和object的区别:this是对当前类做控制, 即保证当前类是线程...原创 2017-08-14 16:31:36 · 6413 阅读 · 0 评论 -
对list的线程不安全操作
对一个线程不安全的集合进行多线程操作, 并不会破单个元素的完整性, 根据java内存模型可知,public class TestCl { List no = Collections.synchronizedList(new ArrayList<>()); //List no = new ArrayList<>(); public static void main(Str原创 2017-10-20 15:18:03 · 1597 阅读 · 0 评论 -
@Async的异常处理
方法一:配置AsyncUncaughtExceptionHandler(对于无返回值的方法)通过AsyncConfigurer自定义线程池,以及异常处理。@Configuration@EnableAsyncpublic class SpringAsyncConfiguration implements AsyncConfigurer { private static final...原创 2018-12-25 18:22:52 · 4647 阅读 · 0 评论 -
子线程中的异常处理
前2种方法都是在子线程中处理,第3种方法是在父线程中处理。具体用哪一种方法,取决于这个异常是否适合在子线程中处理。例如有些异常更适合由调用方(父线程)处理,那么此时就应当用第3种方法。方法一:子线程中try... catch...最简单有效的办法,就是在子线程的执行方法中,把可能发生异常的地方,用try ... catch ... 语句包起来。子线程代码:public class...原创 2018-12-25 17:36:00 · 682 阅读 · 0 评论 -
局部变量一定线程安全吗
局部变量, 如果是基本类型或是包装类型, 依然不能通过多线程改变其值, 如果是对象, 则其属性值是线程不安全的(对象引用是局部变量, 在栈内存, 但是对象本身还是处于堆内存)这样理解还是有偏差, 如果是基础类型, 如int:如果是全局变量, 那么各线程可以直接操作, 其一定是线程不安全的如果是局部变量, 那么只能将该变量作为形参传入线程中, 这时int值是不能被改变的, 不管线程安...原创 2018-07-16 15:46:47 · 6111 阅读 · 1 评论 -
理解原有的内部类实现线程的方式和@async的对比
public void listen() { while (true) { String answercard = answerCardDDao.bpopAnswer(); // computeScore(answercard); threadPooltaskExecutor.execute(new InnerThread(answercard)); } } cla...原创 2018-04-28 18:39:55 · 897 阅读 · 1 评论 -
为@Async实现自定义线程池
第一步,先在Spring Boot主类中定义一个线程池,比如:@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Enabl...原创 2018-04-28 11:20:57 · 7791 阅读 · 1 评论 -
InterruptedException 异常
当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法。 抛InterruptedException的代表方法有:1. java.lang.Object 类的 wait 方法2. java.lang.Thread 类的 sleep 方法3. java.lang.Thread 类的 joi原创 2017-12-14 22:35:38 · 1936 阅读 · 0 评论 -
死锁问题的出现和解决
同步弊端:效率低 如果出现了同步嵌套,就容易产生死锁问题死锁问题及其代码重现死锁: 是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待的现象举例:中国人、美国人吃饭案例正常情况:中国人:筷子两支美国人:刀和叉现在:中国人:筷子一支,刀一把美国人:筷子一支,叉一把产生死锁问题:中国人拿着刀的同时等着美国人把另一只筷子给他...原创 2017-09-19 20:27:36 · 3412 阅读 · 1 评论 -
Java中Volatile关键字详解
更多的关于volatile关键字的介绍参见<深入理解java内存模型>先补充一下概念:Java 内存模型中的可见性、原子性和有序性。可见性:(在多核cpu下,是否也可以理解为同时执行volitale修饰的变量,同一时间有且只有一个线程操作,把volitale看成一个锁???) 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线...原创 2017-04-12 14:37:06 · 536 阅读 · 0 评论 -
AtomicLong源码
package java.util.concurrent.atomic;import java.util.function.LongUnaryOperator;import java.util.function.LongBinaryOperator;import sun.misc.Unsafe;/**一个long值可以用原子更新。 有关原子变量属性的描述,请参阅java.util.c...原创 2017-09-14 14:49:48 · 1036 阅读 · 0 评论 -
Java中守护线程
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应原创 2017-09-14 11:03:33 · 235 阅读 · 0 评论 -
java中的unsafe类
Java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存;类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。public native long al...原创 2017-09-13 16:38:10 · 257 阅读 · 0 评论 -
java线程的中断(interrupt)
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等。 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了那么不能直接把一个线程搞挂掉, 但有时候又有必要让一个线程死掉, 或者让它结束某种等待的状态 该怎么办呢?一个比较优雅而安全的做法是:使用等待/通知原创 2017-08-15 18:32:20 · 592 阅读 · 0 评论