.boom-extension-active { cursor: crosshair !important }
.boom-extension-active *:hover { cursor: crosshair !important }
.boom-extension-hovered-element { outline: 2px solid rgba(130, 170, 210, 0.6) !important }
.boom-extension-expanded-element { background: rgba(0, 0, 0, 0) !important; border: 0 !important; float: none !important; margin-left: auto !important; margin-right: auto !important; paddin...
最近阅读了《Java并发编程实践》这本书,总结了一下几个相关的知识点。线程安全当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。可以通过原子性、一致性、不可变对象、线程安全的对象和加锁保护同时被多个线程访问的可变状态变量来解决线程安全的问题。可见性在没有同步的情况下,编译...
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字...
package com.xinboedu.www.test;/*** 功能概要:* * @author linbingwen* @since 2016年6月11日*/publicclass ThreadGroupDemo {publicstaticvoid main(String[] args) {ThreadGroup threadGroup1 =// 这是匿名类写法new ThreadGroup("group1") {// 继承ThreadGroup并重新定义以下方法// 在线程成员抛出unchecked exception// 会执行此方法publicvoid uncaughtException(Thread t, Throwable e) {System.out.println(t.getName() +...
前言
要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸。最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍。有什么用?volatile主要对所修饰的变量提供两个功能可见性防止指令重排序<br>本篇博客主要对volatile可见性进行探讨,以后发表关于指令重排序的博文。什么是可见性?一图胜千言上图已经把JAVA内存模型(JMM)展示得很详细了,简单概括一下每个Thread有...
不忘初心,方得始终。学习java编程这么长时间,自认为在项目功能需求开发中没啥问题,但是之前的几次面试和跟一些勤奋的或者小牛、大牛级别的人的接触中,才发现自己的无知与浅薄。学习总得有个方向吧,现阶段就想把并发好好学习下,基本考虑的两本书就是《java并发编程的艺术》《java并发编程实战》,之后就是框架、springcloud等。到了现在的阶段,不能只满足于项目需求的实现。为了进入更好的平台,为了更好的薪资,为了她,为了...
java并发编程之Condition引言在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout),notify(),notifyAll(),这些方法配合synchronized关键字一起使用可以实现等待/通知模式。同样,Condition接口也提供了类似Object监视器的方法,通过与Lock配合来实现等待/通知模式。为了更好的了解Condition的特性,我们来对比一下两者的使用方式以及功能特性:对比项Object监视器...
Executor框架Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe) 。Executor在执行时使用内部的线程池完成操作。
一、创建线程池Executors类,提供了一系列工厂方法用于创先...
基本概念进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。一个应用程序至少对应着一个进程,对于一些应用程序,如浏览器或者QQ,允许启动多个同一应用程序,会对应多个进程。每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是系统资源分配和调度的最小单位)原文:https://ww...
Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势: 1、可以避免由于Java的单继承特性而带来的局限; 2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的; 3、适合多个相同程序代码的线程区处理同一资源的情况。 下面以典型的买票程序(基本都是以这个为例子)为例,来说明二...
编写正确的并发程序需要在访问可变状态的时候进行正确的管理。前面说了如何通过同步避免多个线程在同一个时刻访问相同的数据,本章介绍如何共享和发布对象,才能让对象安全地被多个线程同时访问。 synchronized只是实现了原子性和临界区。我们还希望某个线程修改对象状态后,其他线程能够立刻看到状态的变化。3.1 可见性 一般情况下,我们无法保证执行读操作的线程能够立刻看到其他线程写入的值,比如下面的例子:pu...
??? 我们一再提线程、锁等概念,但锁是如果实现的呢?又是如何知道当前阻塞线程的又是哪个对象呢?从java.util.concurrent.locks.LockSupport这个类先说起,因为这个类实现了底层的一些方法,各种的锁实现都是这个基础上发展而来的。这个类方法很少,但理解起来需要花费一点时间,因为涉及了很多底层的知识,这些都是我们平时不关心的。一:查看JDK源码
???
package java.util.concurrent.locks;
import java.util.concurrent.*;
i...
1.什么是自旋锁
自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。2.Java如何实现自旋锁?先看一个实现自旋锁的例子,java.util.concurrent包里提供了很多面向并发编程的类. 使用这些类在多核CPU的机器上会有比较...
原文链接 Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么...
ThreadLocal的原理:每个Thread内部维护着一个ThreadLocalMap,它是一个Map。这个映射表的Key是一个弱引用,其实就是ThreadLocal本身,Value是真正存的线程变量Object。也就是说ThreadLocal本身并不真正存储线程的变量值,它只是一个工具,用来维护Thread内部的Map,帮助存和取。 注意上图的虚线,它代表一个弱引用类型,而弱引用只能存活到下次GC前。 ThreadLocal为什么会内存泄漏ThreadLocal在ThreadLocalMap中是以一个弱引用身份...