04 2019 档案
摘要:1、使用线程池的优点 降低资源的开销 提高程序响应速度 提高线程的可管理性,线程是一种稀缺资源,若不加以限制,不仅会占用大量资源,而且会影响系统的稳定性。 2、线程池实现架构 Executor接口是java线程池框架的顶级接口,定义了一个用于执行Runnable的execute方法,它没有实现类只有
阅读全文
摘要:1、什么是线程安全? 如果一个对象构造完成后,调用者无需额外的操作,就可以在多线程环境下随意地使用,并且不发生错误,那么这个对象就是线程安全的。 2、线程安全的注意事项 对『线程安全性』的讨论必须建立在对象内部存在共享变量这一前提,若对象在多条线程间没有共享数据,那这个对象一定是线程安全的! 我们通
阅读全文
摘要:1、传输层概述 在OSI参考模型中,网络层是面向通信的最高层但同时也是面向用户程序的最底层。 传输层的主要作用: 复用:在发送端,多个应用程序公用一个传输层; 分用:在接收端,传输层把从网络层接收到的数据报拆掉IP报头之后依据端口号分派给不同的应用程序 传输层和网络层的主要区别: 网络层为不同主机提
阅读全文
摘要:1、什么是TCP的可靠传输 它向应用层提供的数据是无差错的、有序的、无丢失的,换言之就是:TCP最终递交给应用层的数据和发送者发送的数据是一模一样的。 2、TCP保证可靠传输的办法有哪些? TCP采用了流量控制、拥塞控制、连续ARQ等技术来保证它的可靠性。 3、停止等待协议 AQR协议:当请求失败时
阅读全文
摘要:1、Java JUC简介 在Java5.0提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步IO和轻量级任务框架。提供可调的、灵活的线程池。还提供了设计用于多线程上下文中的 Collecti
阅读全文
摘要:不考虑线程安全问题的时候单例模式的代码: 分析: 单例模式通俗来说就是要求我们在创建某一个对象的时候只能创建一个这个类的对象。在多线程的情况下,可能会有多个线程在各自的run()方法中调用public static Bank getInstance()方法创建类的对象实例,如果有一个线程再调用方法且
阅读全文
摘要:在Java中,一般都是通过同步机制来解决线程安全问题的,在JDK 5.0之后又新增了Lock的方式来实现线程安全。所以说实现线程安全方式一共有三种方法 方式一: synchronized(同步监视器){ //需要被同步的代码(操作共享数据的代码就是需要被同步的代码) } 通过继承Thread类的方式
阅读全文
摘要:1、通过继承Thread类的方式创建多线程(这里只是简单的代码演示创建多线程的方法) 2、通过实现Runnable接口的方式创建多线程 3、两种方式的比较: 实现Runnable接口的方式没有类的单继承性的限制性; 实现的方式更适合处理多个线程之间有共享数据的情况; 所以在开发中会优先选择实现Run
阅读全文
摘要:1、程序、进程、线程的基本概念 程序:为了完成某种任务用某一种语言编写的一组指令的集合就叫程序。程序就是一段静态的代码。 进程:进程是程序的依次执行过程,或者说是正在运行的一个程序。这是一个动态的过程,有它自身的产生运行和消亡的过程--生命周期。进程是资源分配的基本单位。 线程:进程可进一步的划分为
阅读全文
摘要:1、线程死锁产生的原因: 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,这样就会造成线程的死锁问题 出现线程死锁之后,程序不会报异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续执行 死锁产生的四个必要条件 互斥使用,即当资源被一个线程使用(占有)时,别的线
阅读全文
摘要:1、使用Callable接口的方式实现多线程,这是JDK5.0新增的一种创建多线程的方法 2、使用Callable接口创建多线程和使用Runnable接口创建多线程的异同 相比较Runnable接口,Callable接口的功能更加强大。 相比较Runnable接口中需要重写的run()方法,Call
阅读全文
摘要:一、问题引入:首先实现一个线程通信的实例,使用两个线程交替打印输出100以内的数字。 代码实现如下: wait()、notify()、notifyAll()三个方法的介绍: wait():某个对象调用wait()方法能让当前线程阻塞,并且当前线程还会释放所拥有的锁 调用某个对象的notify()方法
阅读全文
摘要:在JDK5.0之后新增加了一种更强大的线程同步机制 通过显示定义同步锁来实现线程同步解决线程安全问题。同步锁使用Lock对象充当。 java.util.concurrent.locks.lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的单独访问,每一次只能有一个线程对Lock对
阅读全文
摘要:1、题目来源:选自LeetCode 402: 2、问题描述: 3、问题分析 通过分析我们可以得出这样的结论:如果后一个数字比前面的数字小的话,那么我们就要把前面的一个数字删除掉,并且每次把字符串中拆出来的数字push进栈的时候要考虑特殊情况:当栈不为空的时候可以把数字0存进去,反之如果栈为空且数字为
阅读全文
摘要:1、题目来源:选自LeetCode 376:摆动序列 2、题目描述: 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。 例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7
阅读全文
摘要:1、题目来源: 选自LeetCode 455:分发饼干 2、题目描述: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >=
阅读全文
摘要:问题来源:选自leetCode 23:合并K个排序链表 问题描述: 题目给定信息: 不确定需要合并的链表的数目,但依然要求我们把给定的这些有序链表合并成一个链表,并且保证合并的链表依然是有序的。 问题分析: 我们可以使用暴力合并的方法,就是不管有多少个链表,先让第一个链表和第二个链表进行合并,合并之
阅读全文
摘要:问题来源:选自leetcode 21:合并两个有序链表 问题描述: 题目给定信息: 给定两个有序链表,把两个链表合并成一个链表,并且合并后的链表依然是有序的。这两个链表中允许有重复元素 问题分析: 设置一个临时头节点,同时遍历两个原链表,遍历循环的条件是两个链表都不为空的情况下循环才能继续执行。每次
阅读全文
摘要:问题来源:选自LeetCode 138:复制带随机指针的链表 问题描述: 题目给定信息: 该链表中每一个节点的成员变量都有两个,一个是next指针指向该节点的下一个节点,一个是random指针指向不确定,可以指向该链表中任意一个节点,也可以指向它自己,还可以指向为空,我们要克隆这个链表,并且保证每一
阅读全文
摘要:问题来源:选自LeetCode 86:分隔链表 问题描述: 题目给定信息:给定一个链表,我们要把链表按照给定值进行分割,使分割后的链表所有小于给定值的节点都在给定值的左边,且相对位置不变,所有大于给定值的节点都在给定值的右边,且相对位置不变。 问题分析: 我们可以定义两个临时头节点,这两个临时节点分
阅读全文
摘要:问题来源:环形链表 II 问题描述: 题目给定信息:题目中要求我们从给定链表中如果这个链表有环的话返回环的开始节点,如果没环的话返回null 问题分析: 这道题依然是求给定链表是否有环的变异题,要求我们求出有环链表的环的开始节点,在链表求环的问题中我们详细介绍了使用Set方法实现,这里不再过多的叙述
阅读全文
摘要:问题来源:选自LeetCode141 环形链表 问题描述: 题目给定信息:这道题要求我们判断给定的链表是否就像上面的问题描述一样存在环。 问题分析: 这道题也有两个思路:第一个思路就是利用Set集合中不能存在重复的元素,那么我们就可以把这个给定的链表依次存进Set集合中,只不过每次存进去之前我们都要
阅读全文
摘要:问题来源:选自LeetCode 160. 相交链表 问题描述: 题目给定信息:题目中给出两个链表,这两个链表有一部分节点是相互重合的,我们的目的就是要找到两个链表重合的第一个节点,这里需要注意的是链表重合,而不是两个链表的元素相同。 问题分析: 这个问题的解决思路可以由两个: 第一个就是利用set集
阅读全文
摘要:问题来源:选自LeetCode 92:反转链表 II 问题描述: 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
阅读全文
摘要:问题来源:选自LeetCode 206:反转链表 问题描述: 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 题目给定信息: 问题分析: 一直链表的头结点指针,再不申请额外空间的情况下实现链表的逆序,我们的思路就是循环遍历整个
阅读全文
摘要:1、Vector介绍 Vector 是矢量队列,它是JDK1.0版本添加的类。继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。 Vector 继承了AbstractList,实现了List;所以,它是一个队列,支持相关的添加、删除、修改、遍历
阅读全文
摘要:1、 LinkedList介绍 LinkedList是继承于AbstractSequentialList抽象类,它也可以被当作堆栈、队列或者双端队列使用。 LinkedList实现了Deque接口,即能将LinkedList当作双端队列使用。 LinkedList实现 List 接口,能对它进行队列
阅读全文
摘要:1、ArrayList介绍 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。 ArrayList
阅读全文
摘要:Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Colle
阅读全文
摘要:1、fail-fast事件出现的情景 运行该代码,抛出异常java.util.ConcurrentModificationException!即,产生fail-fast事件! 2、fail-fast的简单介绍 fail-fas机制是Java集合中的一种错误检测,当多个线程对同一个集合进行操作的时候,
阅读全文
摘要:说明;这里先学习Map集合,然后再学习Set集合,是因为Set集合中的HashSet依赖于hashMap,就是通过hashMap集合来实现的,TreeSet集合依赖于TreeMap集合,TreeSet集合就是通过TreeMap实现的。基于此,先学习Map集合框架和比较重要的Map实现类。 1、Map
阅读全文
摘要:1、HashMap介绍 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、
阅读全文
摘要:1、List的整体介绍 List 是一个接口,它继承于Collection的接口,它代表着有序的队列。list的实现类对象中每一个元素都有一个索引值,能够按照索引值进行元素查找。 AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现Lis
阅读全文
摘要:1、Stack介绍 Stack是栈。它的特性是:先进后出(FILO:First In Last Out)。 java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。当然,我们也可以将LinkedList当作
阅读全文
摘要:说明:Set的实现类都是基于Map来实现的(HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的)。 (01) Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。(02) AbstractSet 是一个抽象类,它继承于AbstractColle
阅读全文
摘要:1、Map的概括总结 (01) Map 是“键值对”映射的抽象接口。(02) AbstractMap 实现了Map中的绝大部分函数接口。它减少了“Map的实现类”的重复编码。(03) SortedMap 有序的“键值对”映射接口。(04) NavigableMap 是继承于SortedMap的,支持
阅读全文