摘要: 如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler 是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异 常将造成线程中断的时候 JVM 会使用 Thread.getUncaughtExceptionHandler() 来查询线程的 阅读全文
posted @ 2020-04-25 14:20 咔啡 阅读(774) 评论(0) 推荐(0)
摘要: 在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是 不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改变程序运行的结果; 存在数据依赖关系的不允许重排序 需要注意的是:重排序不会影响单线程环境的执行结果,但是会破坏多线程的执 行语义。 阅读全文
posted @ 2020-04-25 14:19 咔啡 阅读(618) 评论(0) 推荐(0)
摘要: 我们可以使用 Thread 类的 Sleep()方法让线程暂停一段时间。需要注意的是,这 并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为 Runnable, 并且根据线程调度,它将得到执行。 阅读全文
posted @ 2020-04-25 14:18 咔啡 阅读(1000) 评论(0) 推荐(0)
摘要: 在两个线程间共享变量即可实现共享。 一般来说,共享变量要求变量本身是线程安全的,然后在线程内使用的时候,如 果有对共享变量的复合操作,那么也得保证复合操作的线程安全性。 阅读全文
posted @ 2020-04-25 00:19 咔啡 阅读(1489) 评论(0) 推荐(0)
摘要: 最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。Wait 通常被用于线 程间交互,sleep 通常被用于暂停执行。 直接了解的深入一点吧: 在 Java 中线程的状态一共被分成 6 种: 初始态:NEW 创建一个 Thread 对象,但还未调用 start()启动线程时,线程处 阅读全文
posted @ 2020-04-25 00:18 咔啡 阅读(667) 评论(0) 推荐(0)
摘要: volatile 保证内存可见性和禁止指令重排。 volatile 用于多线程环境下的单次操作(单次读或者单次写)。 阅读全文
posted @ 2020-04-25 00:17 咔啡 阅读(212) 评论(0) 推荐(0)
摘要: SynchronizedMap 一次锁住整张表来保证线程安全,所以每次只能有一个线程来 访为 map。 ConcurrentHashMap 使用分段锁来保证在多线程下的性能。 ConcurrentHashMap 中则是一次锁住一个桶。ConcurrentHashMap 默认将 hash 表分为 16 阅读全文
posted @ 2020-04-25 00:14 咔啡 阅读(1145) 评论(0) 推荐(0)
摘要: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每 次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传 统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写 锁等,都是在做操作之前先上锁。再比如 Java 里面的同步原语 synchroniz 阅读全文
posted @ 2020-04-25 00:13 咔啡 阅读(1669) 评论(0) 推荐(0)
摘要: 中断 和 共享变量 阅读全文
posted @ 2020-04-25 00:12 咔啡 阅读(650) 评论(0) 推荐(0)
摘要: 使用共享变量的方式 在这种方式中,之所以引入共享变量,是因为该变量可以被多个执行相同任务的 线程用来作为是否中断的信号,通知中断线程的执行。 使用 interrupt 方法终止线程 如果一个线程由于等待某些事件的发生而被阻塞,又该怎样停止该线程呢?这种 情况经常会发生,比如当一个线程由于需要等候键盘 阅读全文
posted @ 2020-04-25 00:11 咔啡 阅读(1076) 评论(0) 推荐(0)
摘要: 为什么要使用 Executor 线程池框架 1、每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗 时、耗资源的。 2、调用 new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的 创建,线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线 阅读全文
posted @ 2020-04-25 00:10 咔啡 阅读(371) 评论(0) 推荐(0)
摘要: 计算机通常只有一个 CPU,在任意时刻只能执行一条机器指令,每个线程只有获得 CPU 的使用权才能执行指令.所谓多线程的并发运行,其实是指从宏观上看,各个线 程轮流获得 CPU 的使用权,分别执行各自的任务.在运行池中,会有多个处于就绪状 态的线程在等待 CPU,JAVA 虚拟机的一项任务就是负责线 阅读全文
posted @ 2020-04-25 00:09 咔啡 阅读(1905) 评论(0) 推荐(0)
摘要: 不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即 对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。 不可变对象的类即为不可变类(Immutable Class)。Java 平台类库中包含许多不可 变类,如 String、基本类型的 阅读全文
posted @ 2020-04-25 00:08 咔啡 阅读(1477) 评论(1) 推荐(0)
摘要: CyclicBarrier 可以重复使用,而 CountdownLatch 不能重复使用。 Java 的 concurrent 包里面的 CountDownLatch 其实可以把它看作一个计数器, 只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器, 也就是同时只能有一个线程去减这 阅读全文
posted @ 2020-04-25 00:05 咔啡 阅读(680) 评论(0) 推荐(0)
摘要: 当你调用 start()方法时你将创建新的线程,并且执行在 run()方法里的代码。 但是如果你直接调用 run()方法,它不会创建新的线程也不会执行调用线程的代码, 只会把 run 方法当作普通方法去执行。 阅读全文
posted @ 2020-04-25 00:04 咔啡 阅读(976) 评论(0) 推荐(0)
摘要: 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程 的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。 线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若 干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它 要使用该资源 阅读全文
posted @ 2020-04-25 00:03 咔啡 阅读(1596) 评论(0) 推荐(0)
摘要: 在 Java 并发程序中 FutureTask 表示一个可以取消的异步运算。它有启动和取消 运算、查询运算是否完成和取回运算结果等方法。只有当运算完成的时候结果才 能取回,如果运算尚未完成 get 方法将会阻塞。一个 FutureTask 对象可以对调用 了 Callable 和 Runnable 阅读全文
posted @ 2020-04-25 00:02 咔啡 阅读(334) 评论(0) 推荐(0)
摘要: 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当 队列满时,存储元素的线程会等待队列可用。 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消 费者是从队列里拿元素的线程。阻塞队列就是生产 阅读全文
posted @ 2020-04-25 00:01 咔啡 阅读(775) 评论(0) 推荐(0)
摘要: Executor 框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框 架。 无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的 解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用 Executors 框架可以非常方便的创建一个线程池。 阅读全文
posted @ 2020-04-25 00:00 咔啡 阅读(709) 评论(0) 推荐(0)