线程安全

并发编程

…衆ロ難τιáo~ 提交于 2019-11-26 20:18:28
目录 怎么理解hashmap的线程不安全,hashtable线程安全,concurrenthashmap部分线程安全 怎么理解hashmap的线程不安全,hashtable线程安全,concurrenthashmap部分线程安全 hashmap线程不安全:可以对table数组并发修改,put方法与get方法没有同步 来源: https://blog.csdn.net/weixin_38876845/article/details/99061956

简单的描述框架

女生的网名这么多〃 提交于 2019-11-26 20:17:55
一、 1.Set:无序,元素不可重复(但是元素在set中的位置是又该元素的HashCode决定的,其实位置是固定的) 2.list:有序,列表存储,元素可重复 3.Map:无序,元素可重复 二、 1.Set接口有两个实现类(HashSet底层由HashMap实现,LinkedHashSet) 2.List接口有三个实现类 (1)LinkedList:基于链表实现,链表内存是散乱的,链表增删快,查找慢 (2)ArrayList:非线程安全的,效率高,基于数组,便于索引,不便于插入删除 (3)Vector:基于线程安全的,效率低,基于数组 3.Map接口:有三个实现类(HashMap,HashTable,LinkedHashMap) (1)HashMap:非线程安全,高效,支持null (2)HashTable:线程安全,低效,不支持null (3)LinkedHashMap:是HashMap的一个字类,保存了记录插入的位置 来源: http://www.cnblogs.com/hhg-94-hm/p/7466648.html

线程安全练习题

て烟熏妆下的殇ゞ 提交于 2019-11-26 19:24:27
【问题】 银行有一个账户(假设初始余额为0)。 有两个储户分别向这一个账户存3000元,每次存1000,存3次,每次存完打印账户余额。 该程序是否需要创建多线程以及是否存在安全问题,如果有,如何解决? 【关键点】 1)明确哪些代码是多线程运行代码,须写入run()方法 2)明确什么是共享数据 3)明确多线程运行代码中哪些语句是操作共享数据的 【分析】 1.是否是多线程的问题?是,多个线程是两个储户 2.是多线程就一定涉及线程安全问题吗?不一定,有没有线程安全问题取决于是否有共享数据 3.是否有共享数据?有,账户(准确的说是账户余额) 4.是否有线程安全问题?有 5.如何解决呢?同步机制:有三种方式 6.可以采用继承Thread类或实现Runnable接口创建多线程(还有别的方式可以创建多线程) package test0; public class ThreadDemo { public static void main(String[] args) { Account acct=new Account(0); Customer c1=new Customer(acct); Customer c2=new Customer(acct); c1.setName("甲"); c2.setName("乙"); c1.start(); c2.start(); } } class

Java的一些并发包

≡放荡痞女 提交于 2019-11-26 19:07:34
同步容器类 Vector和ArayList : ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。 Vector与ArrayList一样, 也是通过数组实现的,不同的是它支持线程的同步 ,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。Vector与ArrayList的扩容并不一样,Vector默认扩容是增长一倍的容量,Arraylist是增长50%的容量 注意: Vector线程安全、ArrayList Vector.add源码: ​ ArrayList.add源码: ​ 由此,看出,Vectory方法使用synchronized同步函数方法写的,线程同步。 HashMap和HashTable: 1.HashMap不是线程安全的 ,HastMap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null

Java servlet多线程

别来无恙 提交于 2019-11-26 18:37:17
Servlet体系结构是建立在 Java 多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet 时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该 Servlet类,也就是有多个线程在使用这个实例。 这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。所以在用Servlet构建的Web应用时如果不注意线程 安全 的问题,会使所写的Servlet程序有难以发现的错误。   实例变量不正确的使用是造成Servlet线程不 安全 的主要原因。下面针对该问题给出了三种解决方案并对方案的选取给出了一些参考性的建议。 1、实现 SingleThreadModel 接口(不推荐,下文会具体讲弊端)   该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要将前面的Concurrent Test类的类头定义更改为:   Public class Concurrent Test extends HttpServlet implements

(57)多线程 - 线程安全-锁机制-Lock锁:卖票系统

£可爱£侵袭症+ 提交于 2019-11-26 17:09:05
/** * 解决线程安全方式三:Lock锁----JDK5.0 * 1.面试:synchronized与Lock的异同 * 相同:都可以解决线程安全问题 * 不同:synchronized机制在执行完相应的同步代码后自动的释放同步监视器 * Lock需要手动的启动同步lock(),同时结束同步也需要手动的实现unlock(); * * 优先使用顺序: * Lock 》 同步代码块 》 同步方法 */ 运行结果: 来源: CSDN 作者: Ricardo__Lu 链接: https://blog.csdn.net/Ricardo__Lu/article/details/97954314

什么是线程安全的类?

放肆的年华 提交于 2019-11-26 17:06:25
线程安全是指在多线程的运行环境之下,通过一定的同步机制,保证多个线程对同一共享资源的操作能够得到正确的执行,符合这样条件的类称为线程安全的类 如下代码: public class Main { private static int count = 0 ; public static void main ( String [ ] args ) throws InterruptedException { Thread t1 = new Thread ( new Runnable ( ) { @Override public void run ( ) { for ( int i = 0 ; i < 1000 ; i ++ ) { count ++ ; } } } ) ; Thread t2 = new Thread ( new Runnable ( ) { @Override public void run ( ) { for ( int i = 0 ; i < 1000 ; i ++ ) { count ++ ; } } } ) ; t1 . start ( ) ; t2 . start ( ) ; t1 . join ( ) ; t2 . join ( ) ; System . out . println ( count ) ; } } 两个线程同时操作同一个数据,都累加1000次

是否线程安全

大憨熊 提交于 2019-11-26 16:47:05
HashMap和HashTable的区别 1.HashMap可以存放null HashTable不能存放null 2.HashMap是线程不安全的 HashTable是线程安全的 StringBuffer和StringBuilder的区别 StringBuffer 是线程安全的 StringBuilder 是非线程安全的 所以当进行大量字符串拼接操作的时,如果是单线程就用StringBuilder,效率高,会更快些,如果是多线程,就需要用StringBuffer 保证数据的安全性 ArrayList和Vector的区别 都继承了AbstractList类,实现了 List <E> , RandomAccess, Cloneable, java.io.Serializable接口, Vector是线程安全的类 ArrayList是非线程安全的 借助Collections.synchronizedList,可以把ArrayList转换为线程安全的List。 还有HashSet,LinkedList,HashMap等等非线程安全的类,都通过Collections工具类转换为线程安全的 来源: https://www.cnblogs.com/q-1993/p/11327106.html

HashMap、HashTable、ConcurrentHashMap

与世无争的帅哥 提交于 2019-11-26 16:34:45
HashTable :底层数组+链表,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化,初始化size为11,扩容后oldSize*2+1,计算index方法是index=(hash & 0x7FFFFFFF) %tab.length HashMap:底层数组+链表实现,可以存储null键和null值,线程不安全。初始zise为16,扩容newsize=oldsize*2,size一定是2的n次幂。扩容针对整个Map,每次扩容时,原来数组的元素一次重新计算存放位置,并重新插入,插入元素才判断要不要扩容,有可能扩容无效(插入后扩容,如果没有再次插入,就会产生无效扩容),当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀,index计算方法:index=hash &(tab.length-1) HashMap的初始值还要考虑加载因子: 哈希冲突:若干key的哈希值数组大小取模后,如果落在同一个数组下标上,将组成一条Entry链,对key的查找需要遍历每个Entry链上的元素执行equals()比较。 加载因子:为了降低哈希冲突的概率,默认当HashMap中的键值对达到数组大小的75%时,就会触发扩容,因此如果预估容量是100

SQLite 线程安全和并发

為{幸葍}努か 提交于 2019-11-26 14:06:45
SQLite 与线程 SQLite 是线程安全的。 线程模型 SQLite 支持如下三种线程模型 单线程模型 这种模型下,所有互斥锁都被禁用,同一时间只能由一个线程访问。 多线程模型 这种模型下,一个连接在同一时间内只有一个线程使用就是安全的。 串行模型 开启所有锁,可以随意访问。 设置线程模型 SQLite 可以通过以下三种方式进行线程模型的设置,在实际应用中选择任一一项都可以。 编译期设定 通过 SQLITE_THREADSAFE 这个参数进行编译器的设定来选择线程模型 初始化设定 通过调用 sqlite3_config() 可以在 SQLite 初始化时进行设定 运行时设定 通过调用 sqlite3_open_v2() 接口指定数据库连接的数据库模型 SQLite 并发和事务 事务 事务是 SQLite 的核心概念。对数据库的操作 (绝大部分) 会被打包成一个事务进行提交,需要注意的是,这里的打包成事务是自动开启的。举例而言,如果简单在一个 for 循环语句里向数据库中插入 10 条数据,意味着将自动生成 10 个事务。但需要注意的是事务是非常耗时的,一般而言, SQLite 每秒能够轻松支持 50000 条的数据插入,但是每秒仅能够支持几十个事务。一般而言,事务速度受限于磁盘速度。所以在批量插入时需要考虑禁用自动提交,将其用 BEGIN ... COMMIT 打包成一个事务