线程安全

不可变对象是线程安全的

笑着哭i 提交于 2019-12-02 23:00:52
不可变对象需要满足的条件 1 对象创建以后其状态就不能修改 2 对象所有域都是final类型 (这样只能对每个域赋值一次,通过构造器初始化所有成员,进行深度拷贝,在get方法中不直接返回对象本身,而是克隆对象并返回克隆) 3 对象是正确创建的(在对象创建期间,this引用没有逸出) public class ImmutableObject { private final Integer a = 1; private final String b = "2"; private final Map<Integer, Integer> map = new HashMap<>(); public ImmutableObject() { map.put(1, 2); map.put(3, 4); map.put(5, 6); } public Map<Integer, Integer> getMap() { // 返回的是新new的map,并且不允许修改 return Collections.unmodifiableMap(map); } } 来源: https://www.cnblogs.com/moris5013/p/11766217.html

php不支持多线程怎么办

╄→гoц情女王★ 提交于 2019-12-02 22:44:02
PHP 默认并不支持多线程,要使用多线程需要安装 pthread 扩展,而要安装 pthread 扩展,必须使用 --enable-maintainer-zts 参数重新编译 PHP,这个参数是指定编译 PHP 时使用线程安全方式。 线程安全 多线程是让程序变得不安分的一个因素,在使用多线程之前,首先要考虑线程安全问题: 线程安全:线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。 在传统多线程中,由于多个线程共享变量,所以可能会导致出现如下问题: 存在一个全局数组$arr = array('a');; A线程获取数组长度为1; B 线程获取数组长度为1; A 线程 pop 出数组元素 $a = array_pop($arr); $a = 'a';; B 线程也 pop 数组元素 $b = array_pop($arr); $a = null;; 此时 B 线程内就出现了灵异事件,明明数组长度大于0,或没有 pop 出东西; PHP 实现 PHP 实现的线程安全主要是使用 TSRM 机制对 全局变量和静态变量进行了隔离,将全局变量和静态变量 给每个线程都复制了一份,各线程使用的都是主线程的一个备份,从而避免了变量冲突,也就不会出现线程安全问题。 PHP 对多线程的封装保证了线程安全

PHP TS 和 NTS 版本选择

匿名 (未验证) 提交于 2019-12-02 22:10:10
在PHP 开发和生产环境搭建过程中,需要安装PHP语言解析器。官方提供了2种类型的版本,线程安全(TS)版和非线程安全(NTS)版,有时后我们开发环境和实际生产的环境有所不同,因此也需要选择安装对应的PHP版本。 在此记录下笔记,方便日后查看 ... 1、简介 TS:   TS( Thread-Safety )即线程安全,多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时进行数据加锁保护,其他线程不能同时进行访问该数据,直到该线程读取完毕,其他线程才可访问使用该数据,好处是不会出现数据不一致或者数据污染的情况,但耗费的时间要比 NTS 长。   PHP以 ISAPI 方式(Apache 常用方式)加载的时候选择TS版本。 NTS:   NTS( None-Thread Safe )即非线程安全,不提供数据访问保护,有可能出现多个线程先后或同时操作同一数据的情况,容易造成数据错乱(即脏数据),一般操作的执行时间要比 TS 短。   PHP以FAST-CGI方式加载运行的时候选择TNS版,具有更好的性能;    ISAPI:   ISAPI( Internet Server Application Programming Interface ), 通常是指被http服务器所加载,以服务器的 模块形式运行 ,由微 软提出,故只能在win平台上运行,如win下的apache

Java并发

匿名 (未验证) 提交于 2019-12-02 21:53:52
Java内存模型是什么? Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了: 线程内的代码能够按先后顺序执行,这被称为程序次序规则。 对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。 前一个对volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。 一个线程内的任何操作必需在这个线程的start()调用之后,也叫作线程启动规则。 一个线程的所有操作都会在线程终止之前,线程终止规则。 一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。 可传递性 更多介绍可以移步并发编程网: (深入理解java内存模型系列文章:http://ifeve.com/java-memory-model-0) Java中interrupted 和isInterruptedd方法的区别? interrupted() 和 isInterrupted()的主要区别是前者会将中断状态清除而后者不会。Java多线程的中断机制是用内部标识来实现的,调用Thread.interrupt(

java设计模式一单例模式

匿名 (未验证) 提交于 2019-12-02 21:53:52
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。如: 1. 需要频繁实例化然后销毁的对象。 2. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 3. 有状态的工具类对象。 4. 频繁访问数据库或文件的对象。 应用场景举例: 1. 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。 2. 网站的计数器,一般也是采用单例模式实现,否则难以同步。 3. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。 4. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 public class EagerSingleton { private static EagerSingleton instance = new EagerSingleton(); /** * 私有默认构造子 */ private EagerSingleton (){} /** * 静态工厂方法 */ public

Java中的String、StringBuilder、StringBuffer三者的区别

匿名 (未验证) 提交于 2019-12-02 21:53:52
Java中的String、StringBuilder、StringBuffer三者的区别 在刚开始学习的时候,对于性能啥的完全不了,一般字符串操作都是String直接加加减减,觉得能完成功能完成就好了。然后考虑到找工作了,看了点面经发现有可能会问到一些相关的问题,了解了一些。后面看了点关于虚拟机的知识,慢慢对String类型如何实现和底层是怎么样的产生了兴趣。找个机会总结一下 这篇文章的内容基本参考自网络,添加了一些自己的想法。 首先,这三者必定是Java处理String的类。那么区别是什么呢? 先简单来说,处理的效率上:StringBuilder > StringBuffer > String 线程安全来说,StringBuilder处理数据是非线程安全的,而StringBuffer是线程安全的。这点主要是从源码的角度来说的。他们两者的区别类似于HashMap和HashTable。在StringBuffer中的方法基本都是有Synchronized 关键字标记,适合在多线程环境中使用,当然因为这样,所以处理效率上比不上StringBuilder。 1、String类 展开一下String类,String类在Java中是不可变类,不可变指的是任何对String类型的改变都基本上是创建一个新的String对象,然后将这个新的对象的引用传递回来,这个步骤由JVM实现

JAVA 线程安全

匿名 (未验证) 提交于 2019-12-02 21:53:52
线程安全定义 一个类在可以被多个线程安全调用时就是线程安全的。 线程安全分类 线程安全不是一个非真即假的命题,可以将共享数据按照安全程度的强弱顺序分成以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。 1. 不可变 不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施,只要一个不可变的对象被正确地构建出来,那其外部的可见状态永远也不会改变,永远也不会看到它在多个线程之中处于不一致的状态。 不可变的类型: final 关键字修饰的基本数据类型; String 枚举类型 Number 部分子类,如 Long 和 Double 等数值包装类型,BigInteger 和 BigDecimal 等大数据类型。但同为 Number 的子类型的原子类 AtomicInteger 和 AtomicLong 则并非不可变的。 2. 绝对线程安全 不管运行时环境如何,调用者都不需要任何额外的同步措施。 小编推荐一个学JAVA的学习裙【四九二,一七三,八四二】,无论你是牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发具,很多干货和技术资料分享 3. 相对线程安全 相对的线程安全需要保证对这个对象单独的操作是线程安全的,在调用的时候不需要做额外的保障措施,但是对于一些特定顺序的连续调用

2018年Java后端面试经历

匿名 (未验证) 提交于 2019-12-02 21:53:32
这是一个专场面,嗯...然后挂的比较惨。面试官第一句话:介绍下自己吧,(balabala),然后瞄了一下简历,你这就两年工作经验,我没啥问的,就问你点基础吧(明显感受到面试官对我并不感兴趣。后来了解到,人家最低要求3)。最后分分钟挂掉,数据结构与算法必须牢固,轻松不得。 快排知道吧,写;嗯,冒泡知道吧,写 讲一讲平衡二叉树 讲一讲深度优先、广度优先 hashmap怎么删除一个重复的元素 2018年4月1号是星期几怎么实现 第二面跟技术主管面聊的时候,说目前对应的是一个偏维护的岗位,所以到华为研发中心去面了一轮(两轮技术面+技术主管面+华为技术面+HR面),只要书看了,理解了,基本上没啥问题(说到底基础还是很重要)。楼主最后是拿到了offer 讲一讲常用的hibernate注解方式 springMVC的controller有哪些注解方式 讲一讲restful,对于请求参数,讲一讲有哪些注解 rest的请求参数如果是一个对象,怎么做的 聊一聊java并发 说一说你最优秀的一个项目 用springMVC的好处 讲一讲事务 如果要实现服务器要向客户端推送消息,你会怎么做,用什么方式 StringBuffer是怎么实现线程安全的 反转数组元素,你会怎么实现 hibernate的关系映射如何做 为什么要重写equals()方法和hashCode()方法

java面试之JVM与多线程

匿名 (未验证) 提交于 2019-12-02 21:52:03
1. synchronized 和volatile的区别: 2.什么是happens-before原则? 3.线程有几种状态? 4.指令重排序 5.什么是线程安全与非线程安全? 6.类的加载与卸载? 7. synchronized与volatile的实现原理? 8.什么是类加载器? 9.什么是双亲委派模型? 10.垃圾回收机制? 11.CAS与ABA 12.乐观锁与悲观锁? 13.AQS 与lock 14.什么情况下会触发FullGC? 15.什么情况触发minorGC? 16.java1.8为什么用Metaspace(元空间)替换掉PermGen(永久代)?Metaspace保存在哪里? 17.线程池 18.对象引用有哪几种方式? 19.Java对象生命周期与类的生命周期? 20.JUC常用工具? 21.阻塞非阻塞、同步与非同步的概念? 22.wait()与sleep()方法的异同点? 23.Synchronized 和 ReentrantLock 有什么不同?各适合什么场景? 24.读写锁的适用场景?ReentrantReadWriteLock是如何实现的? 25.线程间的通信方式? 26.保证线程安全的方法有哪些? 27.如何提高多线程的并发性能? 28. ThreadLocal用来解决什么问题?ThreadLocal是如何实现的? 29.类的线程安全 30

java知识点总结(String,StringBuffer,StringBuilder)

匿名 (未验证) 提交于 2019-12-02 21:52:03
String String:字符串常量(线程安全),被声明为final,因此不能被继承(Integer等包装类也不能被继承)。 java8中,String内部使用char数组储存数据。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; } 在 Java 9 之后,String 类的实现改用 byte 数组存储字符串,同时使用 coder 来标识使用了哪种编码。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final byte[] value; /** The identifier of the encoding used to encode the bytes in {@code value}. */ private final byte