线程安全

Java容器概述

故事扮演 提交于 2019-12-03 01:27:44
Java容器(Container) 什么是容器? 容器可以管理对象的生命周期、对象与对象之间的依赖关系。 直白点说容器就是一段Java程序,能够帮助你管理对象间的关系,而不需要你自行编写程序处理。 维基百科定义: 在计算机科学中,容器是指实例为其他类的对象的集合的类、数据结构、[1][2]或者抽象数据类型。换言之,它们以一种遵循特定访问规则的系统的方法来存储对象。容器的大小取决于其包含的对象(或元素)的数目。 潜在的不同容器类型的实现可能在空间和时间复杂度上有所差别,这使得在给定应用场景中选择合适的某种实现具有灵活性。 Java内部的容器类 Java内部的容器类主要分为两类:Collection(集合)与Map(图) Collection Set HashSet 基于哈希表实现,底层使用HashMap来保存所有元素。 不能保证迭代顺序 允许使用null元素 LinkedHashSet LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承于HashSet。 内部使用双向链表维护插入顺序。 TreeSet 基于(TreeMap)红黑树实现 TreeSet非同步,线程不安全 TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。 List ArrayList 实现 List 接口

java容器类的继承结构

断了今生、忘了曾经 提交于 2019-12-03 01:23:24
Java容器类库定义了两个不同概念的容器,Collection和Map Collection 一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素。Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序。 (文中Jdk源码版本无特殊说明均为jdk1.8.0_101) public interface Collection<E> extends Iterable<E> { 可以看到,java定义了Collection接口和内部集合的基本操作方法,Collection默认可以进行对集合末端添加元素,删除指定元素等操作。List、Set、Queue接口都继承自Collection并定义了各自不同的方法。如果你想学习Java可以来这个群,首先是二二零,中间是一四二,最后是九零六,里面有大量的学习资料可以下载。 Map 一组成对的”键值对”对象,允许我们使用键来查找值。 public interface Map<K,V> { Map内部接口Entry<K,V>对应着Map的键值对。 具体介绍 迭代器 先介绍一下迭代器。迭代器本身也是一种设计模式,设计的初衷在于:容器的实现由很多种,而我们想对容器进行遍历操作的话,首先不应该关心容器实现的细节,其次遍历操作应该是轻量级的。迭代器统一了对容器的访问方式,同时创建它的代价很小。值得注意的是

redis三个框架

匿名 (未验证) 提交于 2019-12-03 00:43:02
Jedis api 在线网址:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html redisson 官网地址:https://redisson.org/ redisson git项目地址:https://github.com/redisson/redisson lettuce 官网地址:https://lettuce.io/ lettuce git项目地址:https://github.com/lettuce-io/lettuce-core 概念:   Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持,   Redisson:实现了分布式和可扩展的Java数据结构。   Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。 优点:   Jedis:比较全面的提供了Redis的操作特性   Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列   Lettuce:主要在一些分布式缓存框架上使用比较多 可伸缩: Jedis:使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行

HashMap和Hashtable的区别

匿名 (未验证) 提交于 2019-12-03 00:43:02
二者继承的类与实现的接口 HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类(Dictionary类是一个已经被废弃的类)。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。 HashTable比HashMap多了两个公开方法。一个是elements,这来自于抽象类Dictionary,鉴于该类已经废弃,所以这个方法也就没什么用处了。另一个多出来的方法是contains,这个多出来的方法也没什么用,因为它跟containsValue方法功能是一样的。 Null Key & Null Value HashMap是支持null键和null值的,而HashTable在遇到null时,会抛出NullPointerException异常。这并不是因为HashTable有什么特殊的实现层面的原因导致不能支持null键和null值,这仅仅是因为HashMap在实现时对null做了特殊处理,将null的hashCode值定为了0,从而将其存放在哈希表的第0个bucket中。 线程安全 Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步。 HashMap不是线程安全的

JDK8版本之日期和时间API详解

匿名 (未验证) 提交于 2019-12-03 00:39:02
伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。Java也意识到需要一个更好的 API来满足社区中已经习惯了使用JodaTime API的人们。全新API的众多好处之一就是,明确了日期时间概念,例如:瞬时(instant)、 长短(duration)、日期、时间、时区和周期。同时继承了Joda库按人类语言和计算机各自解析的时间处理方式。不同于老版本,新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。下面是新版API中java.time包里的一些关键类: Ins伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。Java也意识到需要一个更好的 API来满足社区中已经习惯了使用JodaTime API的人们

方法内的变量是线程安全的

匿名 (未验证) 提交于 2019-12-03 00:36:02
package com.freeflying.thread.sync; /** * @ClassName: MethodVarThreadSafe * @Description:方法内的变量是线程安全的 * @author freeflying * @date 2018年6月25日 */ public class MethodVarThreadSafe { public static void main(String[] args) { MethodVarThreadSafeEx safeEx=new MethodVarThreadSafeEx(); MethodVarThreadSafeA safeA=new MethodVarThreadSafeA(safeEx); safeA.start(); MethodVarThreadSafeB safeB=new MethodVarThreadSafeB(safeEx); safeB.start(); } } class MethodVarThreadSafeEx{ public void add(String username) { try { int num = 0; if("a".equals(username)) { num=100; System.out.println("a set over"); Thread.sleep

线程安全

匿名 (未验证) 提交于 2019-12-03 00:34:01
线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类出正确的行为,那么这个类(对象或方法)就是线程安全的。 2. synchronized synchronized:可以在任意 对象及方法 上加锁,而加锁的这段代码称为“互斥区”或“临界区” public class MyThread extends Thread { private int count = 5 ; //synchronized加锁 //继承Thread类一定要重写run()方法 public synchronized void run (){ count--; System.out.println( this .currentThread().getName() + " count = " + count); } //有5个线程,同一个时间去访问某一个类MyThread这个类的run方法,对count进行--操作,打印count的值 public static void main (String[] args){ MyThread myThread = new MyThread(); //实例化5个线程,把同一个MyThread类的实例对象注入进去 Thread t1 = new Thread(myThread, "t1" ); Thread t2 = new Thread(myThread, "t2" )

不可重入函数

匿名 (未验证) 提交于 2019-12-03 00:32:02
1.malloc,free, printf均是不可重入函数(意味不能在中断函数或信号处理函数同时调用),但是线程安全函数(意味它可以被多个线程调用) 2.函数有static变量或者全局变量,则该函数是不可重入函数 满足下面条件之一的多数是不可重入函数: (1)使用了静态数据结构或者全局变量; (2)调用了malloc或free; (3)调用了标准I/O函数;标准io库很多实现都以不可重入的方式使用全局数据结构。 (4)进行了浮点运算.许多的处理器/编译器中,浮点一般都是不可重入的 (浮点运算大多使用协处理器或者软件模拟来实现。 (5)调用printf。 mallo函数和printf函数实现 1.引用了全局变量 --- printf引用全局stdout, malloc,free会引用全局的内存分配表 2.调用了semtake --- 在VxWorks源代码的函数memPartAlignedAlloc内存在这样一行代码semTake (&partId->sem, WAIT_FOREVER);它通过获取分区锁来保证内存申请操作的线程互斥,因此,在ISR内调用malloc会导致OS重复调用调度器函数reschedule出现中断重入。printf内部也包含了semTake操作,中断服务程序中不能有阻塞操作。 可重入和线程安全(Thread-Safe)是两个不同的概念

HashMap 和HashTable

匿名 (未验证) 提交于 2019-12-03 00:32:02
两者有什么相同和不同? 都实现了Map接口 HashMap 是基于哈希表实现的 每一个元素是一个Key-Value对,采用单链表来解决哈希冲突问题,容量不足(超过阈值) 会自动增长。Hash Map是非线程安全的 只是用于单线程环境下,多线程(高并发)环境下 用concurrentHashMap, HashMap 键值对允许为null HashTable 线程安全 也是 synchronized的 文章来源: HashMap 和HashTable

什么是多线程和线程问题

匿名 (未验证) 提交于 2019-12-03 00:30:01
什么是多线程,一组独立功能的静态计算机指令: 进程是一次程序动态的运行过程,他有就绪,阻塞,运行等状态。 进程:向系统申请资源的独立单位。 QQ。就是开了一个进程,再打开迅雷,又开了一个进程,那我们在QQ上可以传输文字,语音,广告弹出,理解为开了一个线程,换句话理解就是线程是任务,一个进程可以管理多个线程,进程里面会至少包括一条线程,通俗地讲,进程是领导,线程是员工,进程管理线程,进程本身不执行,只是为线程提供运行环境申请内存空间。 进程的切换代价非常的大 1.单进程单线程:一个人在一个桌子上吃菜。 2.单进程多线程:多个人在同一个桌子上一起吃菜。 3.多进程单线程:多个人每个人在自己的桌子上吃菜。 多线程: (1)一个进程里面同时执行多个任务。 (2)一个进程里面至少有一个线程 (3)开启多个线程是为了同时执行多个任务,也是同时执行多部分代码。 利弊: 好处:解决了多任务同时执行的问题。 弊端:线程切换花费额外的资源,同时切换也是一个耗时的步骤。 如何让创建线程: 第一种方式 (1)Thread的子类 (2)run方法 (3)创建子类对象 (4)开启线程 name获取线程的名字,默认为Thread-x java是单继承。但是我们可以用接口的方式来扩展。 runnable接口,实现了run方法,创建线程Thread(myRunnable)开启。 一般我们都是使用第二种方法创建线程,