线程安全

多线程-synchronized

心已入冬 提交于 2019-12-02 06:20:38
线程安全和 synchronized 进程和线程 进程:运行一个程序就是一个进程,进程是线程的容器 线程:程序执行流的最小单元,单个程序中同时运行多个线程完成不同的工作就是多线程。 异步和同步 异步:无需等待其他调用者的完成,可以继续往下执行 同步:需等待其他调用者完成,才能继续往下执行 并行和并发 并发:两个任务在执行的时候,时间上没有重叠,两个任务是交替执行,由于切换很快,对于外界调用者来说相当于同一时刻多个任务一起执行了。 并行:两个任务在时间上有重叠,并行才是真正意义上的同一时刻可以多个任务同时执行。 线程安全 当多个线程访问操作同一个共享资源时候就会发生线程安全性问题。 保证线程安全就需要采用加锁机制。 当一个线程访问该类的某个数据时进行保护,其它线程不能进行访问,直到该线程读取完,释放锁,其它线程才可以使用。常见加锁:synchronized。 synchronized (1) 可以在任意对象及方法上加锁,而加锁的这段代码称之为互斥区和临界区。 使用synchronized修饰的方法,多线程就会以排队的方式进行处理。一个线程想要执行synchronized修饰的方法里的代码,首先是尝试获得锁,如果拿到锁,执行synchronized代码体的内容;如果拿不到锁的话,这个线程就会不断的尝试获得这把锁,直到拿到为止,而且多个线程同时去竞争这把锁,也就是会出现竞争的问题。 (2

偷学代码之单例模式

 ̄綄美尐妖づ 提交于 2019-12-02 06:19:13
初级程序员,也被称为搜索程序员。 1.啥是单例模式 在JAVA中单例模式是23种设计模式之一,也是最常用的 设计模式 。 单例模式分三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式有以下特点:   1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。   单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。 总之,选择单利模式就是为了避免不一致状态,避免政出多头。 一些常用的底层操作,比如数据库连接,获取数据库配置文件的操作等等,我们可以将这些操作提取到一个工具类(ConfigManager.java),并把它设计为单例模式。 2.它长啥样 下面给出一个经典例子: public class Singleton{ private static Singleton unique Instance=null; private Singleton(){ /

JVM虚拟机基础

亡梦爱人 提交于 2019-12-02 06:17:54
1. 什么是JVM   JVM(Java Virtual Machine)是用来保证java的跨平台性的,将.class字节码文件转换成操作系统能够直接识别的指令,它的本质是一个进程。 2. Java对象编译过程 主要分为两个部分: 源文件编译成字节码对象 字节码由java虚拟机解释执行 3. 类加载器   类的加载是将类的.class文件中的二进制文件读取进内存中,将其放进运行时数据区的方法区内,然后在堆区创建一个java.lang.class对象,用来封装类在方法区内的数据结构。   注意:jvm主要是在程序第一次主动使用类的时候,才去加载该类,jvm并不是一开始就去嫁娶程序中所有的类,而是到不得不用的时候才加载它,并且只加载一次。 A. 类加载器 BootStrap ClassLoader(根类/启动类加载器):负责加载$JAVA_HOME中jre/lib/rt.jar相关的jar包,底层使用C++实现。 Extension ClassLoader(拓展类):负责加载$JAVA_HOME中jre/lib/ext/*.jar,JDK1.9的时候更名为Platform ClassLoader。 AppClassLoader(应用程序加载器):负责加载classpath中指定的jar包及目录下的class。JDK1.9的时候更名为System ClassLoader。

Java面试汇总

喜你入骨 提交于 2019-12-02 05:32:30
首先,感谢这篇文章的作者分享! 本文分为十九个模块,分别是: 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 的区别是什么? == 解读 对于基本类型和引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; 引用类型

枚举相关-这一篇全了解

青春壹個敷衍的年華 提交于 2019-12-02 05:22:37
什么是枚举? 解: 链接: Java的枚举类型用法介绍-HollisChuang's Blog 枚举是如何实现的? 解: 参考 链接: 深度分析Java的枚举类型—-枚举的线程安全性及序列化问题-HollisChuang's Blog Java 枚举类比较用 == 还是 equals,有哪些区别? 解: java 枚举值比较用 == 和 equals 方法没啥区别,两个随便用都是一样的效果。因为枚举 Enum 类的 equals 方法默认实现就是通过 == 来比较的;类似的 Enum 的 compareTo 方法比较的是 Enum 的 ordinal 顺序大小;类似的还有 Enum 的 name 方法和 toString 方法一样都返回的是 Enum 的 name 值。 Java 枚举类可以继承其他类(或实现其他接口)或者被其他类继承吗,为什么? 解: 枚举类可以实现其他接口但不能继承其他类,因为所有枚举类在编译后的字节码中都继承自 java.lang.Enum,而 Java 不支持多继承,所以枚举类不可以继承其他类。 枚举类不可以被继承,因为所有枚举类在编译后的字节码中都是继承自 java.lang.Enum)的 final class 类,final 的类是不允许被派生继承的。 Java中的switch是如何对枚举进行支持的? 解: Java 1.7 之前 switch

深入理解Python中的GIL(全局解释器锁)

自作多情 提交于 2019-12-02 05:13:13
深入理解Python中的GIL(全局解释器锁) Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁)。这篇我们就来看看这个GIL究竟是怎么回事。 1. GIL是什么? 首先来看看GIL究竟是什么。我们需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。 那么CPython实现中的GIL又是什么呢?GIL全称Global Interpreter Lock为了避免误导,我们还是来看一下官方给出的解释: In CPython, the global

多线程编程 - PHP 实现

泄露秘密 提交于 2019-12-02 04:58:35
/*--> */ /*--> */ 多线程 线程 首先说下线程: 线程( thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 . 使用多线程主要是因为它在执行效率上有很大优势。由于线程是操作系统能够进行调度的最小单位: 一个多线程程序比单线程程序被操作系统调度的概率更大,所以多线程程序一般会比单线程程序更高效; 多线程程序的多个线程可以在多核 CPU 的多个核心同时运行,可以将完全发挥机器多核的优势; 同时对比多进程程序,多线程有以下特点: 线程的创建和切换的系统开销都比进程要小,所以一定程度上会比多进程更高效; 线程天生的共享内存空间,线程间的通信更简单,避免了进程 IPC引入新的复杂度。 适用场景 多线程的优化是很多,可是无脑使用多线程并不能提升程序的执行效率,因为线程的创建和销毁、上下文切换、线程同步等也是有性能损耗的,耗费时间可能比顺序执行的代码还多。如: sumSmall 是一个从1 累加到50000 的函数。 上图是在主线程内执行了三次 sumSmall 和三个线程分别执行 sumSmall ,再将结果同步到一个线程的时间对比,我们会发现只在主线程执行的时间反而更短,三个线程创建、切换、同步的时间远远大过了线程异步执行节省的时间

【Java基础】谈谈集合.CopyOnWriteArrayList

﹥>﹥吖頭↗ 提交于 2019-12-02 04:47:07
目录 实现原理 遍历时不用加锁的原因 CopyOnWriteArrayLis的缺点 使用场景 总结 参考 本篇博客介绍CopyOnWriteArrayList类,读完本博客你将会了解: 什么是COW机制; CopyOnWriteArrayList的实现原理; CopyOnWriteArrayList的使用场景。 经过之前的博客介绍,我们知道ArrayList是线程不安全的。要实现线程安全的List,我们可以使用 Vector ,或者使用Collections工具类将List包装成一个 SynchronizedList 。其实在Java并发包中还有一个CopyOnWriteArrayList可以实现线程安全的List。 在开始之前先贴一段概念 如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。优点是如果调用者没有修改该资源,就不会有副本(private copy)被建立,因此多个调用者只是读取操作时可以共享同一份资源。 实现原理 Vector这个类是一个非常古老的类了,在JDK1.0的时候便已经存在,其实现安全的手段非常

Spring 中的bean 是线程安全的吗?

本秂侑毒 提交于 2019-12-02 03:48:43
结论: 不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。 Spring 的 bean 作用域(scope)类型   1、singleton:单例,默认作用域。   2、prototype:原型,每次创建一个新对象。   3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。   4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。   5、global-session:全局会话,所有会话共享一个实例。 线程安全这个问题,要从单例与原型Bean分别进行说明。 原型Bean   对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。 单例Bean   对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。   如果单例Bean,是一个 无状态Bean ,也就是线程中的操作不会对Bean的成员执行 查询 以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

JAVA基础

余生长醉 提交于 2019-12-02 03:00:06
JAVA面试准备 String、StringBuffer、StringBuilder的区别,怎么理解String的不变性 == 和 equals的区别,重写equals() 和 不重写 hashCode()会发生什么 java io hashmap 和 hash table区别 hashmap怎么解决hash冲突 jdk1.8对hashmap的改进 hashset底层实现 是不是线程安全的 arraylist 和 linkedlist的区别是不是线程安全 concurrenthashmap 怎么保证线程安全 hashtable怎么保证线程安全 什么是内部类,什么是匿名内部类 volatile保证可见性 synchronized和lock的区别 synchronized底层实现 线程等待时位于哪个区域 java多线程实现方式 进程线程,线程安全,怎么保证多线程安全 可重入锁,有哪些 线程池的好处 线程的局部变量,线程池的参数 JVM内存划分 垃圾收集算法,什么时候进入老年代,什么时候进行fullGC java堆溢出问题怎么处理,内存泄漏和内存溢出的区别 线程池的参数 java和python的区别,面向对象的理解,对比面向过程 java为什么不能多继承 JVM类加载机制、类加载器、双亲委派模型 jvm调优 -Xms 和 -Xmx分别指的是什么 其他 什么情况会发生死锁,死锁的处理方法