JiangKun Blog

Thinking will not overcome fear but action will.

线程池

线程池

1、线程池的优势 (1)、降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗; (2)、提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行; (3)方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现...

生产者消费者模型

生产者消费者模型

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。 真实世界中的生产者消费者模式 生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满...

实现阻塞队列

实现阻塞队列

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 当队列满了的时候进行入...

单例模式

单例模式

饿汉 类加载的时候就创建了实例 优点:类加载的时候创建一次实例,避免了多线程同步问题 缺点:即使单例没被用到也会创建,浪费内存 public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Si...

Volatile

Volatile

volatile 修饰的共享变量,可以保证可见性,部分保证顺序性 class ThraedDemo { private volatile int n; } 可见性:   可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制...

Synchronized

Synchronized

synchronized的底层是使用操作系统的mutex lock实现的。 当线程释放锁时,JMM会把该线程对应的工作内存中的共享变量刷新到主内存中 当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取共享变量 synchronized用的锁是存在Java对象头里的。 synchronized同步快对同一条线程来说是可重入的,不会出现自...

多线程

多线程

1.线程: 要解释线程,就必须明白什么是进程 进程时系统资源分配的最小单位,线程是系统调度的最小单位。一个进程内的线程之间是可以共享资源的。 每个进程至少有一个线程存在,即主线程。 1.1 多线程的优势 - 增加运行速度 多线程在一些场合下是可以提高程序的整体运行效率的 1.2 Java语言中,创建线程的基本方法 (本质核心都需要有一个Thread对象出来) 创建一个Th...

关于JVM内存

关于JVM内存

这是一个比较官方的图 JVM 内存模型图 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:<font color = red > 程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区 </font> 下面详细阐述各数据区所存储的数据类型。 运行时数...

Comparable和Comparator

Comparable和Comparator

Java当中如何实现比较自定义类型的大小呢? 在Java当中,自定义类型不可以通过> < =来比较,一般有3种方式来实现: Comparable、Comparator、equals() 今天先学习Comparable Comparator 1.Comparable接口 通过实现Comparable接口,重写CompareTo方法 class Student implement...

浅谈Java中的String

浅谈Java中的String

1.创建字符串 String str = "hello"; System.out.println(str); String str2 = new String("abcdef"); System.out.println(str2); char[] val = {'a','b','c','d','e','f'}; String str3 = new String(val); System.o...