随笔分类 -  java基础以及多线程

Executors常见的线程池创建以及其问题
摘要:采用工厂类的方式来创建线程池,主要有五种: newCachedThreadPool(可缓存的线程池) 他在创建新线程时如果有可重用的线程,则重用他们,否则创建一个新的线程并添加到线程池中,因此对于执行时间短的任务来说,该线程池能够恒大成都的重用线程从而提高了系统的性能;在线程池的keepAliveT 阅读全文
posted @ 2020-06-21 15:46 CccccDi 阅读(425) 评论(0) 推荐(0)
线程池
摘要:使用线程池的原因 多线程是为了用来最大化发挥多核处理器的处理能力,但是线程是不能无限创建的,当线程创建太多时,反而会消耗CPU与内存资源。 线程的创建与销毁是需要时间的,假如一个线程的创建时间加上销毁时间还要远大于服务时间时,是得不偿失的;线程需要占用内存资源,大量线程的创建会占用宝贵内存资源,可以 阅读全文
posted @ 2020-06-20 23:22 CccccDi 阅读(129) 评论(0) 推荐(0)
阻塞队列和死锁
摘要:BlockingQueue BlockingQueue是并发容器的一种,在J.U.C的包路径下,是线程安全的一种实现,是基于阻塞队列的,该接口提供了相对于Queue的新的put()和take()操作。put()添加元素时,当阻塞队列满的情况下会阻塞下来,当有空间时才能进行添加操作,添加到队列尾部;t 阅读全文
posted @ 2020-06-19 21:08 CccccDi 阅读(911) 评论(0) 推荐(0)
ConcurrentHashMap
摘要:ConcurrentHashMap与HashMap的实现方法类似,不同的是它采用的是分段锁的思想支持并发的操作,它是线程安全的。 要了解ConcurrentHashMap,首先要了解Segment,一个Segment就相当于一个HashMap对象。与HashMap一样,Segment包含一个Hash 阅读全文
posted @ 2020-05-29 22:44 CccccDi 阅读(204) 评论(0) 推荐(0)
ReentrantLock,公平性锁和非公平性锁
摘要:公平性锁与非公平性锁 非公平性: 如果一个线程因为CPU时间全部被其他的线程抢走而无法获得CPU的执行时间,这种状态称之为饥饿,而该线程被称为“饥饿致死”,非公平锁就存在“饥饿”,因为线程得不到CPU的运行时间机会。 公平性: 所有的线程均能公平性的获取到执行的机会。 线程饥饿的原因: 高优先级的线 阅读全文
posted @ 2020-04-26 11:52 CccccDi 阅读(498) 评论(0) 推荐(0)
Lock
摘要:Synchronized是独占锁,性能低,Lock借助JNI完成的高级锁实现。Lock接口实现的锁比synchronize的锁更加广泛,实现了更加灵活地操作,支持多个Condition对象。 Lock接口下提供的方法:void lock();void lockInterruptibly();cond 阅读全文
posted @ 2020-04-05 22:30 CccccDi 阅读(238) 评论(0) 推荐(0)
IDEA的maven项目的netty包的导入(其他jar同)
摘要:在这之前要有搭建好maven的环境,可以参考上一篇。https://www.cnblogs.com/128-cdy/p/12604298.html 1。 2。选择Modules 3。 4。 等待一会选择,Download to可以不用勾选,下载的jar会放在本地的jar仓库里,如果勾选了则会在该项目 阅读全文
posted @ 2020-03-31 21:43 CccccDi 阅读(8938) 评论(0) 推荐(0)
maven的安装与项目的创建
摘要:maven最新版本3.6.3的下载 链接:https://pan.baidu.com/s/12LPKkiE0x_Aq4S8qUnYa6g 提取码:7njx 下载完成解压后可以进行环境变量的配置。 1。新建一个MAVEN_HOME的变量名。 2。找到Path,新建一个%MAVEN_HOME%\bin的 阅读全文
posted @ 2020-03-31 13:23 CccccDi 阅读(502) 评论(0) 推荐(0)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
摘要:该题目可以采用二分的思想,查找该元素。实现如下: private static String find(int[] arr,int num) { int left = 0; int right = arr.length - 1; while (left <= right){ if(num < arr 阅读全文
posted @ 2020-03-30 00:34 CccccDi 阅读(2914) 评论(0) 推荐(0)
使用二分法查询二维整型数组的值(找到返回其坐标)
摘要:该二维数组的特征是: a.每行中的整数从左到右按升序排列。 b.每行的第一个整数大于前一行的最后一个整数。 可以每行都进行二分查找(由于该数组的特征,所以可以先将要查找的数与本行的最后一个数据比较,若大于则直接进入下一行比较,增加效率,减少比较的次数),如果未找到则进入下一层,直到找完该二维数组。 阅读全文
posted @ 2020-03-29 23:26 CccccDi 阅读(367) 评论(0) 推荐(0)
乐观锁以及悲观锁
摘要:悲观锁 假设是每次获取数据都认为会被其他线程修改,每次来操作数据(可读、可写)的时候都会加锁;悲观锁的实现是Synchronized。 悲观锁存在问题: 1、多线程竞争,引起性能问题 (锁的释放和获取需要上下文切换和调度等) 2、一个线程获取锁会导致其他线程被挂起(阻塞) 乐观锁 假设对数据的操作一 阅读全文
posted @ 2020-03-24 20:50 CccccDi 阅读(814) 评论(0) 推荐(0)
ABC三个线程,交替打印
摘要:有三个线程,分别为A、B、C线程,需要线程交替打印:ABCABCABC...打印10次。 首先创建一个一个线程间通讯的类: class Opt { //下一个执行的编号 private Integer nextInde; public Integer getNextInde() { return n 阅读全文
posted @ 2020-03-23 15:10 CccccDi 阅读(671) 评论(0) 推荐(0)
查找数组中的数,找到返回其下标,若找不到返回-1
摘要:public class Search { public static void main(String[] args) { int[] arr = {1,3,5,6,8,10,13,19,22}; int i = funSearch(arr,arr.length,80); System.out.p 阅读全文
posted @ 2020-03-19 23:25 CccccDi 阅读(501) 评论(0) 推荐(0)
线程同步synchronized
摘要:同步条件:等待池序列,锁机制。 锁池:获取同一把锁的线程,在为抢夺锁时会进入到锁池 等待池:调用wait操作的线程,会释放掉锁,进入到该对象的等待池中。 notify和nitifyAll的区别: notify唤醒的是对象等待池中的一个线程,这个线程会进入到blocked状态,也叫做进入锁池中,等待获 阅读全文
posted @ 2020-03-17 09:12 CccccDi 阅读(348) 评论(0) 推荐(0)
volatile
摘要:首先看看如下代码以及结果:(计算一秒钟内count++的结果) public class VolatileDemo { private static Boolean flag = true; //创建一个状态变量flag public static void main(String[] args) 阅读全文
posted @ 2020-03-16 00:58 CccccDi 阅读(169) 评论(0) 推荐(0)
并发
摘要:指的是多个线程操作同一个资源,多线程来交替的操作同一个资源(CPU,内存资源)。 临界资源和临界区: 临界资源:一个时刻只允许一个线程访问,一个线程在访问临界资源时,其他线程是不能访问的,临界资源是不可剥夺资源,OS不能阻止资源的独享行为。 临界区:是一个线程中访问临界资源的代码片段。 临界区的使用 阅读全文
posted @ 2020-03-14 23:58 CccccDi 阅读(665) 评论(0) 推荐(0)
垃圾回收机制
摘要:过程: 发现无用对象(无任何变量引用该对象) 回收无用对象所占的内存空间 分代机制: 分代垃圾回收机制,是基于这样一个事实: 不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率.我们将对象分为三种状态:年轻代,年老代,持久代。同时,将处于不同状态的对象放 阅读全文
posted @ 2020-03-13 20:01 CccccDi 阅读(185) 评论(0) 推荐(0)
给定一个正整数num ,反复将各个位上的数字相加,直到结果为一位数
摘要:示例:输入: 38输出: 2解释:各位相加的过程为:3 + 8= 11, 1 + 1=2。由于2是一位数,所以返回2。可以先将输入的数的各个位数字进行相加,然后对其结果再进行像初始输入的数的一样的操作,直到最后各个位的数字的和小于10。 private static int count(int nu 阅读全文
posted @ 2020-03-12 23:25 CccccDi 阅读(1240) 评论(0) 推荐(0)
线程常用方法介绍
摘要:start():启动线程 start方法启动一个新线程,start方法首先调用才能创建子线程,不能重复使用 public synchronized void start() { group.add(this); boolean started = false; try { start0(); sta 阅读全文
posted @ 2020-03-12 21:03 CccccDi 阅读(251) 评论(0) 推荐(0)
JVM内存模型
摘要:JVM的内存划分: 方法区:是线程共享的,常量静态变量的JIT(即时编译器)编译后代码也在方法区存放。用来存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆得一个逻辑部分,但是他却有个别名Non-Heap(非堆),目的是为了与Java堆区 阅读全文
posted @ 2020-03-09 00:23 CccccDi 阅读(201) 评论(0) 推荐(0)