摘要:一、CAS CAS(Compare And Swap),即比较并交换。是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种
阅读全文
摘要:https://blog.csdn.net/hcmony/article/details/80410397 1、常用的五种并发包 ConcurrentHashMap CopyOnWriteArrayList CopyOnWriteArraySet ArrayBlockingQueue LinkedB
阅读全文
摘要:一、JVM常用启动参数 -Xms:设置堆的最小值。 -Xmx:设置堆的最大值。 -Xmn:设置新生代的大小。 -Xss:设置每个线程的栈大小。 -XX:NewSize:设置新生代的初始值。 -XX:MaxNewSize:设置新生代的最大值。 -XX:PermSize:设置永久代的初始值。 -XX:M
阅读全文
摘要:JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。 1.JDK JDK(Java Developme
阅读全文
摘要:无状态对象一定是线程安全的。即无共享变量。 提高需求:统计已处理请求数量。这样就会产生共享状态,需要考虑线程安全。 方法一:普通++i。非线程安全。 方法二:利用线程安全类AtomicLong来管理类的状态。将复合操作++i转变为原子操作,保证线程安全性。 提高需求:将最近的计算结果缓存起来,当两个
阅读全文
摘要:schedule方法: 在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。 固定延迟
阅读全文
摘要:ThreadLoacl类:解决变量在不同线程间的隔离性,即不同线程拥有自己的值,不同线程中的值是可以放入ThreadLocal类中进行保存的。为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。这个类使线程中的某个值与保存值的对象关联起
阅读全文
摘要:interrupted():测试当前线程【运行此方法的当前线程】是否已经是中断状态,执行后具有将状态标志清除为false的功能。 isInterrupted():测试线程对象是否已经是中断状态,但不清除状态标志。 interrupted()的例子: 从上可以看出thread.interrupted(
阅读全文
摘要:先看第一个例子: 运行结果如下: 解析构造函数部分: 由于构造函数是被main主线程调用的,所以这里的Thread.currentThread()返回的是主线程main。其实就是表明Thread.currentThread()表示当前代码段正在被谁调用。 而this就是只当前线程myThread。至
阅读全文
摘要:当有多个线程共享同一数据时,可能导致数据不一致问题,也就是常见的银行存款取款问题,如果多个线程同时处理某一账户上的钱,则可能导致a取了100,b取了100,而钱只少了100的情况,当然还有更多数据不一致的情况发生。示例代码如下: 运行结果: 由于线程执行的随机性,以及多个线程共享同已数据的特性,导致
阅读全文
摘要:1.调用start()方法: 通知“线程规划器”当前线程已经准备就绪,等待调用线程对象的run()方法。这个过程就是让系统安排一个时间来调用Thread中的run()方法,使线程得到运行,启动线程,具有异步执行的效果。 调用start()方法,也就是线程状态转变成可运行状态的过程。 2.调用run(
阅读全文
摘要:1.继承Thread类。 源码结构:public class Thread implements Runnable 从中可以看出Thread类实现了Runnable,由于java中不支持多继承,所以实现多线程时,可以采用实现Runnable的方式。 2.实现Runnable接口。 注意一下声明与调用
阅读全文
摘要:字节码class文件、可执行代码、机器码的生成与执行: 1)编译器将Java源代码编译成字节码class文件 2)类加载到JVM里面后,执行引擎把字节码转为可执行代码 3)执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行。 运行Java的几个命令: 1)java用来运行一个.class
阅读全文
摘要:线程的状态: 在任意一个时间点,一个线程只能有且只有其中的一种状态 1. 新建(new):新创建了一个线程对象。 2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权
阅读全文
摘要:一、JVM的分区: 1、程序计数器(私有) 程序计数器是一块较小的内存分区,你可以把它看做当前线程所执行的字节码的指示器。 在虚拟机的概念模型里,字节码解释器工作时,就是通过改变计数器的值来选择下一条需要执行的字节码指令。 程序技术器为线程私有,每个线程都有它们各自的程序计数器,这样再多线程的情况下
阅读全文
摘要:一、字段含义: 1.corepoolsize:核心池的大小,默认情况下,在创建了线程池之后,线程池中线程数为 0, 当有任务来之后,就会创建一个线程去执行任务,当线程池中线程数达到 corepoolsize 后, 就把任务放在任务缓存队列中。 2.Maximumpoolsize:线程池中最多创建多少
阅读全文
摘要:1. 堆溢出 java堆用于存储对象实例,只要不断地创建对象,并且这些对象不会被回收(什么情况对象不会被回收呢?如:由于GC Root到对象之间有可达路径,所以垃圾回收机制不会清除这些对象),那么,当对象的数量达到一定的数量,从而达到了最大堆容量(-Xmx)限制了,这个时候会产生内存溢出异常。 ja
阅读全文
摘要:wait()注意以下几点: 1)wait()是属于Object类的方法。 2)调用了wait()之后会引起当前线程处于等待状态。 3)将当前线程置入“预执行队列”中,并且在wait()所在的代码行处停止执行,直到接到通知或被中断为止。 4)在调用wait()之前,线程必须获得该对象的对象级别锁,即只
阅读全文
摘要:硬件内存模型: Java内存模型: 每个线程都有一个工作内存,线程只可以修改自己工作内存中的数据,然后再同步回主内存,主内存由多个内存共享。 下面 8 个操作都是原子的,不可再分的: 1) lock:作用于主内存的变量,它把一个变量标识为一个线程独占的状态。 2) unlock:作用于主内存的变量,
阅读全文