线程安全

HashMap的存储原因与比较器

∥☆過路亽.° 提交于 2020-01-16 01:06:39
一: 1.存储键值对的数据 key value->在哈希表结构中 2.key获取hashcode()值一个int的整数,根据hash算法进行计算,算出桶的位置 hash算法: hashcode()值 % 数组的长度 hashcode()值 & 数组的长度-1 ---->数组的长度必须为2的整数幂 3.先判断对应桶中是否已经存在数据,有,判断桶中的数据是否与我当前的key相等,使用equals(),如果相等value覆盖,如果不相等,把数据放入链表的最后 对应桶中是否已经存在数据,没有,那就直接放入桶中 如果equals相等,hashcode一定要保证相等,保证相等的数据桶的位置一样,才会比较equals进行去重 hashcode相等,equals不一定相等,所以我才要放入桶的时候比较equals() 总结: 如果使用hashMap存储数据,key是自定义的引用的数据类型,一定要重写hashcode()和equals()方法 java8:哈希表(数组+链表+红黑树):当桶中的数据超过8个,把结构当前链表结构变为红黑树 初始容量:16 加载因子:0.75 当16*0.75达到临界点12进行扩容 扩容: 扩容位桶的大小 二: Arrays 操作数组的工具类 此类包含用来操作数组(比如排序和搜索)的各种方法 Collections 操作容器的工具类 HashMap 线程不安全,效率较高

Java2019最新面试题

落爺英雄遲暮 提交于 2020-01-15 17:19:38
2019最新整理JAVA面试题附答案 作者:Jack 包含的模块: 本文分为十九个模块,分别是:Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 如下图所示: 共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单 ==================================================== 一. Java 基础模块 1.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。 具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。 2.== 和 equals 的区别是什么

Java多线程面试题整理

◇◆丶佛笑我妖孽 提交于 2020-01-15 09:38:38
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。 3) 如何在Java中实现线程? 1)java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行, 2)由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。 3). 实现Callable接口通过FutureTask包装器来创建Thread线程 Callable接口(也只有一个方法)定义如下: public interface Callable<V> { V call() throws Exception; } public class SomeCallable<V>

通俗易懂设计模式解析——单例模式

懵懂的女人 提交于 2020-01-15 06:14:43
通俗易懂设计模式解析——单例模式 目录 二、单例模式介绍   (一)来由   (二)意图   (三)单例模式实现方法 三、使用场合及优缺点   一、使用场合 二、优点 三、缺点 四、总结 一、前言   在上一节中我们对设计模式进行了一定的介绍及分类。设计模式分为创建型、结构型、行为型。 创建型模式——主要负责对象的创建。结构型职责——主要负责处理类与对象的组合。行为型模式——主要负责类与对象交互中的职责的分配问题 。今天我们也是讲述介绍创建型模式中的第一个模式—— 单例模式 。 回到顶部 二、 单例模式介绍   (一) 来由     单例模式(Singleton Pattern)是最简单的一个设计模式 ,这种设计模式属于创建型模式。在程序中总会有一些特殊的类。它们必须保证在系统中只存在一个实例,这个单一的类自己创建自己的对象,同时确保只有单个对象被创建,并且提供唯一的访问形式。可以直接进行访问,不用再新建实例。     那么如何避开常规的设计,来实现一个类一个实例、并且保证唯一调用呢?这时候就是单例模式施展身手的时候了。   (二) 意图      保证一个类仅有一个实例,并提供一个访问它的全局访问点。   (三) 单例模式实现方法     单例模式到底又是如何实现的呢?既然是单一实例,那么队友多线程又该如何处理呢?下面我们一一来看看单例模式的实现

记一次小米的Java面试

柔情痞子 提交于 2020-01-15 04:52:49
记一次小米Java面试 时间 一面 二面 三面 感受 时间 12月19号周四上午在BOSS直聘上投了简历,因为当晚要加班,所以约了下周一晚上的视频面试;一面过后第二天hr电话沟通二面时间,定了下周一下午的现场面试,二面三面一起。 一面 二分查找(递归和非递归) 反转链表(递归和非递归) 常用Java集合类(主要是Map/List以及对应的线程安全的集合类,比如HashMap/ConcurrentHashMap/HashTable, ArrayList/CopyOnWriteList/Vector) HashMap为什么长度是2的n次幂,数据结构(数组链表红黑树),扩容(包括元素移动的细节),线程不安全的问题 ConcurrentHashMap怎么保证线程安全,1.7和1.8有什么变化,为什么要要这么优化 CopyOnWriteList怎么保证线程安全,为什么这么做 Java synchronized关键字的作用,原理,锁升级、锁粗化、锁消除 volatile关键字的作用,原理 MVCC 事务的ACID,每一项是如何保证的 MySQL的索引结构,为什么是B+树而不是B树 二面 先升序后降序的数组排序 求递增数组中相加等于10的元素对 17^400 - 19100计算结果能不能被10整除 一个url对应一个random值,要求设计一个系统,根据url查询random值,具体到表怎么设计

SpringBoot集成:1、SpringBoot -Redis-前期

☆樱花仙子☆ 提交于 2020-01-15 04:43:22
一、概要 随着Spring Boot2.x的到来,支持的组件越来越丰富,也越来越成熟,其中对Redis的支持不仅仅是丰富了它的API,更是替换掉底层Jedis的依赖,取而代之换成了Lettuce(生菜)Lettuce和Jedis的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例 二、常用的java连接框架 1、Jedis Github Jedis是Redis官方推荐的Java连接开发工具 2、redisson 官方网站 实现了分布式和可扩展的Java数据结构 3、lettuce 用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。* 官方网站 4、对比: **Jedis:**比较全面的提供了Redis的操作特性 **Redisson:**提供很多分布式相关操作服务,例如: 分布式锁 , 分布式集合 ,可通过Redis支持延迟队列 Lettuce: 主要在一些 分布式缓存 框架上使用比较多 三、spring-data

线程安全的原子性、可见性与有序性

本秂侑毒 提交于 2020-01-15 04:16:36
原子性: 一个或多个操作在CPU执行过程中不被中断的特性称之为原子性 。线程中执行的操作要么全部执行,要么全部不执行。 Java内存模型中的read、load、assign、use、store和write都可以保证原子性的操作(如果对Java内存模型不熟悉,可以参考我的这篇博文 Java内存模型 ),一般基本数据类型访问读写都是原子性的(long和double的非原子性协议例外,但是基本也不会发生) 如果应用场景需要一个更大范围的原子性保证,我们可以直接使用synchronized关键字,在synchronized块之间的操作也具有原子性。 可见性: 可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。 Java内存模型是通过变量修改之后同步回主内存,在变量读取之前从主内存刷新变量值来实现可见性的。如果一个普通变量在多线程中运行的话,往往不能保证可见性,多个线程都是从主内存中获取变量,这时多个线程并不会先等待某一个线程修改完变量之后,写回主内存,再从主内存获取最新的变量值。 如果要保证可见性的话,我们可以使用volatile关键字,具体原理可以参考我的这篇博文 Java的volatile关键字 ,当然除了volatile关键字之外,synchronized和final关键字也能实现可见性

设计模式-单例模式

大憨熊 提交于 2020-01-15 04:03:03
对某个类只能存在一个对象实例,并且该类只提供一个获得其对象实例的方法(静态方法) 单例模式的八种方式: 1.饿汉式(静态变量) 2.饿汉式(静态代码块) 3.懒汉式(线程不安全) 4.懒汉式(线程安全,同步方法) 5.懒汉式(线程安全,同步代码块) 6.双重检查 7.静态内部类 8.枚举 饿汉式(静态变量) public class Singleton1 { public static void main(String[] args) { //测试 Singleton instance1=Singleton.getInstance(); Singleton instance2=Singleton.getInstance(); System.out.println(instance1==instance2);//true } } //饿汉式(静态常量) class Singleton{ //1.构造器私有化,外部不能new private Singleton(){ } //2.本类内部创建对象实例 private final static Singleton instance=new Singleton(); //3.提供一个公有的静态方法,返回实例对象 public static Singleton getInstance(){ return instance; } } 优缺点:

Java基础 - 多线程

六眼飞鱼酱① 提交于 2020-01-15 01:01:18
多线程 概念详解: 并行 和 并发两者的区别: 并发:指两个或多个事件在 同一个时间段 内发生(同一时间段发生) 并行:指两个或多个事件在 同一时刻 发生(同时发生) 线程 和 进程两者的区别: 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程 中是可以有多个线程的,这个应用程序也可以称之为多线程程序 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多 个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创 建、运行到消亡的过程。 总结:就是 一个程序至少是包含一个进程 一个进程至少是包含一个线程 线程调度的方式: 两种方式 分时调度 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间 抢占式调度 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度 创建线程类: 创建线程类的方式 和 步骤: 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把 run()方法称为线程执行体。 创建Thread子类的实例,即创建了线程对象 调用线程对象的start()方法来启动该线程 public class Test {

为什么会有多线程?什么是线程安全?如何保证线程安全?(带详细例子)

筅森魡賤 提交于 2020-01-14 23:18:09
本文将会回答这几个问题: 为什么会有多线程? 什么是线程安全? 怎么样保证线程安全? 为什么会有多线程 显然,线程安全的问题只会出现在多线程环境中,那么为什么会有多线程呢? 最早期的计算机十分原始,还没有操作系统。想要使用计算机时,人们先把计算机可以执行的指令刻在纸带上,然后让计算机从纸带上读取每一条指令,依次执行。这时候的计算机每次只能执行一个任务,是地地道道的单线程。 这种情况下就产生了三个问题: 1. 计算资源的严重浪费 计算机在执行任务时,总少不了一些输入输出操作,比如计算结果的打印等。这时候CPU只能等待输入输出的完成。所以往往一个任务执行下来,可能CPU大部分人时间都是空闲的。而在当时CPU可是一种非常昂贵的资源,于是人们就想怎么能够提高CPU的利用率呢? 2. 任务分配的不公平 现在假如我们有十个任务需要执行,这可是很常见的。而计算机每次只能执行一个任务,直到执行结束,中间不能中断。那么问题来了,是先执行张三给的任务呢?还是先干李四的活呢?张三和李四可能拥有同样的优先级,因此无论怎么分配任务总会有人不满意,觉得不公平。 3. 程序编写十分困难 计算机一次只能执行一个任务,所以编写程序的时候往往要把很多工作集成到一个程序中,这给程序的编写人员带来了极大的挑战。能不能把程序分模块编写,然后让模块之间只进行必要的通信呢? 为了解决这些问题,计算机操作系统应运而生