线程安全

数组

ⅰ亾dé卋堺 提交于 2020-02-10 04:27:23
1.List接口 ArrayList(查询快,增删慢,查询快)    内部通过数组实现,当数组大小不满足时需要增加存储能力,将已有的数组的数据复制到新的存储空间,当插入或者删除元素时候,需要对数组进行复制移动,代价高,   默认容量时10,扩容1.5倍 Vector(数组实现,线程同步)   支持线程同步,即某一时刻只有一个线程能够写vector,因为访问比ArrayList慢 LinkList(双链表结构,增删慢,查询快)    不支持高效的随机元素访问,LinkedList 是一个实现了 List 接口和 Deque 接口的双端链表。使得 LinkedList 类也具有队列的特性; LinkedList 不是线程安全的,如果想使   LinkedList 变 成 线 程 安 全 的 , 可 以 调 用 静 态 类 Collections 类 中 的 synchronizedList 方 法 : List list=Collections.synchronizedList(new LinkedList(...)); 2.Set接口     hashCode存储,如果想让两个不同的对象相等,必须覆盖object的hashCode方法和equals方法 HashSet(无序,哈希表)    按照哈希值存取数据,通过hashcode方法来获取,HashSet首先判断两个元素的哈希值

并发编程之线程第二篇

北慕城南 提交于 2020-02-08 22:50:00
并发编程之线程第二篇 3.12 五种状态 3.13 六种状态 4.1 共享带来的问题 4.2 synchronized解决方案 4.4 变量的线程安全分析 4.6 Monitor概念 1. 轻量级锁 2. 锁膨胀 3.12 五种状态 这是从操作系统层面来描述的 【初始状态】仅是在语音层面创建了线程对象,还未与操作系统线程关联 【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由CPU调度执行 【运行状态】指获取了CPU时间片运行中的状态 (1)当CPU时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换 【阻塞状态】 (1)如果调用了阻塞API,如BIO读写文件,这时该线程实际不会用到CPU,会导致线程上下文切换,进入【阻塞状态】 (2)等BIO操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】 (3)与【可运行状态】的区别是,对【阻塞状态】的线程来说只要它们一直不唤醒,调度器就一直不会考虑调度它们 【终止状态】表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态 3.13 六种状态 这是从Java API层面来描述的 根据Thread.State枚举,分为六种状态 NEW 线程刚被创建,但是还没有调用start()方法 RUNNABLE 当调用了start()方法之后,注意,Java

40个Java多线程问题总结

▼魔方 西西 提交于 2020-02-08 22:14:31
前言 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 1、多线程有什么用? (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 (2)防止阻塞 从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题

解决线程安全的三种方法

点点圈 提交于 2020-02-08 13:30:52
1:线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 我们通过一个案例,演示线程的安全问题: 电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是 “上海堡垒”,本次电影的座位共50个(只能卖50张票)。 我们来模拟电影院的售票窗口,实现多个窗口同时卖 “葫芦娃大战奥特曼”这场电影票(多个窗口一起卖这50张票)需要窗口,采用线程对象来模拟;需要票, Runnable 接口子类来模拟 模拟买票 : public class Ticket implements Runnable { private int ticket = 50; /* *执行卖票操作 */ @Override public void run() { //每个窗口卖票的操作 //窗口 永远开启 while (true) { if (ticket > 0) {//有票 可以卖 //出票操作 //使用sleep模拟一下出票时间 try {Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } //获取当前线程对象的名字 String name = Thread.currentThread()

设计模式 - 单例模式

萝らか妹 提交于 2020-02-08 05:01:10
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决:一个全局使用的类频繁地创建与销毁。 何时使用:当您想控制实例数目,节省系统资源的时候。 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码:构造函数是私有的。 应用实例: 一个班级只有一个班主任。 Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 避免对资源的多重占用(比如写文件操作)。 缺点:没有接口,不能继承,与单一职责原则冲突

线程安全的问题

放肆的年华 提交于 2020-02-08 02:51:29
在上一节中主要讲了JVM内存模型和线程安全的可见性问题,本节重点讲解线程安全的原子操作; 竞态条件与临界区 代码示例 public class IncrDemo { public int i = 0 ; public void incr ( ) { i ++ ; //临界区 } } 共享资源 不可变对象 原子操作定义 CAS机制 J.U.C包内的原子操作封装类 线程安全代码示例 volatile线程安全示例: public class LockDemo1 { volatile int value = 0 ; // 直接操作内存,修改对象,数组内存....强大的API static Unsafe unsafe ; private static long valueOffset ; static { try { // 反射技术获取unsafe值 Field field = Unsafe . class . getDeclaredField ( "theUnsafe" ) ; field . setAccessible ( true ) ; unsafe = ( Unsafe ) field . get ( null ) ; // 获取到 value 属性偏移量(用于定于value属性在内存中的具体地址) valueOffset = unsafe . objectFieldOffset

什么是php多线程?

我怕爱的太早我们不能终老 提交于 2020-02-07 05:54:26
PHP在默认的情况下是不支持多线程的,通过安装pthreads扩展,让其参数来指定编译PHP的线程安全方式来使其支持多线程,但是使用的过程中要考虑到线程安全的问题 线程是操作系统中进行运算调度的最小单位。它被包含在进程中,是进程中的实际运作单位。今天将要分享的是线程知识是有关于PHP的,具有一定的参考价值,希望对大家有所帮助 多线程的理解 所谓多线程就是在在一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程大大提高了程序的执行效率,一个多线程比单线程被操作系统调度的概率更大。而且更高效。多个线程可以在多核CPU的多个核心同时运行,加快了运行效率。而且线程间的通信更加简单。 PHP多线程 在默认情况下PHP是不支持多线程的,要使用多线程需要安装 扩展,目前常用的扩展有pcnlt,POSIX ,pthreads,但是用的最多的还是pthreads扩展,它通过使用参数来指定来编译PHP时的线程安全方式,使其支持多线程 在使用线程之前首先要考虑到线程的安全问题,线程安全指的是某个函数或函数库在多线程环境中被调用时,能够正确的处理多线程之间的共享变量,使得程序的功能能够正确完成 例: 在多线程中由于存在共享变量,很有可能会导致出现以下问题: 存在一个全局数组:$arr = array('a'); A 线程获取数组长度为1; B 线程获取数组长度为1; A 线程pop出数组元素

Java中HashMap和TreeMap

牧云@^-^@ 提交于 2020-02-07 05:08:19
Java中HashMap和TreeMap **HashMap 非线程安全 TreeMap 非线程安全 ** 在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。这就是我们平时说的键值对。 HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。 线程安全 关于线程以及线程安全的相关知识有待笔者继续学习,敬请关注。 在Java里,线程安全一般体现在两个方面: 多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized。如ArrayList和Vector,HashMap和Hashtable (后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。 每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样 两种常规Map实现 HashMap: 基于哈希表实现

java多线程

微笑、不失礼 提交于 2020-02-07 04:06:50
文章目录 多线程简介 创建多线程方法 构造方法 成员方法 多线程实现案例 1 多线程实现案例 2 线程调度 线程优先级 线程控制 休眠线程 加入线程 礼让线程 守护线程 中断线程 线程安全 判断线程安全问题存在可能性的标准 线程安全问题的解决方案:同步机制 同步方法的格式及锁对象问题 Lock 实现类 成员方法 死锁问题 部分线程安全与不安全类 线程通信 未通信导致错误案例 等待唤醒机制 等待唤醒机制实现案例 ThreadGroup 线程组 构造方法 成员方法 线程池 Executors 成员方法 ExecutorService 成员方法 线程池实现案例一:Runnable 线程池实现案例二:Callable 线程池实现案例三:Callable 带泛型 匿名内部类方式实现多线程案例 Timer 定时器 构造方法 成员方法 定时器的简单实现案例 多线程简介 进程 进程是系统进行资源分配和调用的独立单位 线程 在同一个进程中又可以同时执行多个任务,每一个任务可以看做是一个线程 线程是程序执行的单元、执行路径,也是程序使用 CPU 的基本单元 多线程及其意义 多线程不能提高程序的执行速度,但是可以使应用程序在抢占 CPU 资源时占得上风,但无法保证,线程的执行具有随机性 并行和并发 并行:逻辑上同时发生,指在某一个时间内同时运行多个程序 并发:物理上同时发生

浅谈java中的ThreadLocal类

你离开我真会死。 提交于 2020-02-06 22:10:40
在谈ThreadLocal之前,先简单说一下一致性问题及其解决方法。 1.一致性问题 发生在多个主体对同一份数据无法达成共识。包括分布式一致性问题、并发问题等。特点是场景多、问题复杂、难以察觉——需要严密的思考甚至数学论证。 2.一致性问题解决方法 一致性问题的解决方法通常有3个。第一 排队 :比如,锁、互斥量、管程、屏障等。第二 投票 :例如,paxos、Raft等。这两种都会产生额外的开销。还有一种是 避免 产生一致性问题:比如 ThreadLocal 等,为解决多线的并发问题提供了新的思路。 3.ThreadLocal是什么 定义:提供 线程局部 变量;一个线程局部变量在多个线程中,分别有独立的值(副本)。 特点:简单(开箱即用)、快速(无额外开销)、安全(线程安全) 场景:多线程环境下,资源持有、线程一致性、并发计算、线程安全等场景。 4.ThreaLocal的API 构造函数ThreadLocal<T>() 初始化 initialValue() 访问器 get/set 回收 remove ThreadLocal能使线程中的某个值与保存值的对象关联起来。它提供了get和set等访问方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回由当前执行线程在调用set时设置的最新值。 5.ThreadLocal的简单实用