线程安全

JUC-3-ConcurrentHashMap

江枫思渺然 提交于 2019-12-05 11:46:14
ConcurrentHashMap 锁分段机制 JDK1.8 ConcurrentHashMap使用的是分段锁技术,ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。 来源: https://www.cnblogs.com/wf-zhang/p/11923163.html

php ts nts v6 v9的区别

别来无恙 提交于 2019-12-05 08:50:44
VC6:legacy Visual Studio 6 compiler,就是使用这个编译器编译的。 VC9:Visual Studio 2008 compiler,就是用微软的VS编辑器编译的 由于apache.org只提供VC6的版本,所以使用原版apache时只能使用VC6。(www.apachelounge.com上有apache VC9的版本提供,应该可以和PHP VC9配合,没用过) TS:Thread Safe 线程安全, 执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源 NTS:Non Thread Safe 非线程安全, 在执行时不进行线程(Thread)安全检查 PHP的两种执行方式: ISAPI和FastCGI 。 ISAPI(Internet Server Application Programming Interface)执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本apache中的配置方式: LoadModule php5_module "xxx/php5apache2_2.dll" AddType application/x-httpd

Java多线程之线程安全

本秂侑毒 提交于 2019-12-05 06:44:24
   当多条语句在操作同一个线程共享数据的时候,一个线程对多条语句只执行了一部分,还没有执行完的时候,另外一个线程参与进来执行。导致线程共享数据出现错误。例如在对同一个账户进行取款时,账户余额为1000元,A某个时刻正在取走1000元时,B也参与进来取走1000元,此时,账户余额就会出现错误,这就是线程安全的问题。   解决这类安全问题,我们只能让一个线程都执行完,执行过程中其他线程不得参与进来。完毕后,再让另一条线程执行进来。Java对于这种多线程的安全问题提供了专业的解决方式:同步机制。本文就是介绍几种解决方式。 1、同步锁    在讲到方法之前不得不先提到同步锁机制。   "对于并发工作,你需要某种方式来防止两个任务访问相同的资源。防止这种冲突的方法就是当资源被一个任务使用时,在其加上锁。第一个访问某项资源的任务时必须锁定这项资源,使其他任务在被解锁之前,就无法访问它了,而在其被解锁之时,另一个任务就可以锁定使用它了"引用至《Thinking in Java》   说到底synchronized锁(同步锁)可以是任意对象。所有的对象都自动含有单一的锁。也可以叫做监视器。必须保证使用同一个资源的多个线程共用一把锁。否则无法保证共享资源的安全。 2、 同步代码块 synchronized(对象){ 需要被同步的代码} 对于同步代码块而言。synchronized锁可以自己指定

集合家族——List集合汇总

吃可爱长大的小学妹 提交于 2019-12-05 05:28:16
一、概述   List继承了Collection,是 有序 的列表。   可重复数据   实现类有ArrayList、LinkedList、Vector、Stack等 ArrayList 是基于数组实现的,是一个数组队列。可以动态的增加容量! LinkedList 是基于链表实现的,是一个双向循环列表。可以被当做堆栈使用! Vector 是基于数组实现的,是一个矢量队列,是线程安全的! Stack 是基于数组实现的,是栈,它继承与Vector,特性是FILO(先进后出) 二、情景使用   1. 当集合中对插入元素数据的速度要求不高,但是要求快速访问元素数据,则使用ArrayList!   2. 当集合中对访问元素数据速度不做要求不高,但是对插入和删除元素数据速度要求高的情况,则使用LinkedList!   3.当集合中有多线程对集合元素进行操作时候,则使用Vector!但是现在BVector现在一般不再使用,如需在多线程下使用,可以用CopyOnWriteArrayList,在java.util.concurrent包下。   4.当集合中有需求是希望后保存的数据先读取出来,则使用Stack! 三、各自简介    3.1 ArrayList     ArrayList 是最常用的 List 实现类,内部是通过 数组 实现的,它允许对元素进行 快速随机访问

线程安全

 ̄綄美尐妖づ 提交于 2019-12-05 04:30:50
某个线程操作共享数据的过程中,尚未操作完成时,其他线程参与进来。 Java中,我们通过同步机制解决线程安全问题。 方式一:同步代码块   synchronized(同步监视器){     需要被同步的代码  } 说明:操作共享数据的代码,即为需要被同步的代码    共享数据:多个线程共同操作的变量    同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。       要求:多个线程必须要共用同一把锁 方式二:同步方法   如果操作共享数据的代码完整的声明在一个方法中,我们可以将此方法声明为同步的 1.同步方法仍然设计到同步监视器,只是不需要显示的声明 2.非静态的同步方法,同步监视器是this   静态同步方法,同步监视器是类 来源: https://www.cnblogs.com/ergePython/p/11905969.html

java锁机制的面试题

匆匆过客 提交于 2019-12-05 04:25:39
1、ABA问题 CAS 会导致“ABA问题”。 CAS 算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。 比如说一个线程 one 从内存位置 V 中取出 A,这时候另一个线程 two 也从内存中取出 A,并且 two 进行了一些操作变成了 B,然后 two 又将 V 位置的数据变成 A,这时候线程 one 进行 CAS 操作发现内存中仍然是 A,然后 one 操作成功。尽管线程 one 的 CAS 操作成功,但是不代表这个过程就是没有问题的。 部分乐观锁的实现是通过版本号(version)的方式来解决 ABA 问题,乐观锁每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行 +1 操作,否则就执行失败。因为每次操作的版本号都会随之增加,所以不会出现 ABA 问题,因为版本号只会增加不会减少。    2、CAS乐观锁 CAS 是项乐观锁技术,当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。 CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则

深入研究Servlet线程安全性问题

旧时模样 提交于 2019-12-05 04:14:06
Servlet/JSP技术和ASP、 PHP 等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。然而,很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题。 Servlet的多线程机制 Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行. 这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。所以在用Servlet构建的Web 应用 时如果不注意线程安全的问题,会使所写的Servlet程序有难以发现的错误。 Servlet的线程安全问题 Servlet的线程安全问题主要是由于实例变量使用不当而引起的,这里以一个现实的例子来说明。 Import javax.servlet. *;

线程安全---Day23

允我心安 提交于 2019-12-05 03:18:03
最近忙着备考大学四年最后的两科,昨天刚考完大学所有的考试,但是大学专业是机械,但是自己热衷于IT行业,想往IT行业走,希望毕业后能成功进入到IT行业,只希望毕业能找到一份Java开发工程师的工作,这样我才能专研和学习到更高深的技术.希望在毕业前能学到一点Java的精髓,让我可以成功进入到IT行业,加油~ 线程问题: 1 package demosummary.threadsafety; 2 3 public class Ticket implements Runnable{ 4 //定义票数 5 private int ticket = 100; 6 /** 7 * 执行卖票方法 8 */ 9 @Override 10 public void run() { 11 //卖票窗口永久开启 12 while (true) { 13 //判断票是否卖完 14 if (ticket > 0) { 15 try { 16 //三秒卖一张票 17 Thread.sleep(3000); 18 } catch (InterruptedException e) { 19 e.printStackTrace(); 20 } 21 String name = Thread.currentThread().getName(); 22 System.out.println(name+"正在卖:"

哪些集合类是线程安全的?

点点圈 提交于 2019-12-05 03:08:34
Vector Stack Hashtable java.util.concurrent 包下所有的集合类 ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque... Java 自学指南 Java 面试题汇总PC端浏览【点这里】 Java知识图谱 Java 面试题汇总小程序浏览,扫二维码 所有资源 资源汇总于公众号 来源: https://www.cnblogs.com/ConstXiong/p/11901156.html

String,StringBuffer,StringBuildee的区别是什么?String为什么是不可变的?

安稳与你 提交于 2019-12-05 02:30:28
1、String是常量字符串,从源码从可以看出是final类型的,有final修饰的类叫做最终类,它不能被继承,final修饰的方法不能重写。而它的值可以改变,比如常量值。 (String部分源码如下) (final类不能被继承)如下: (final方法不能重写)如下: 使用方法如下: String str = "Hello";    2、StringBuffer是字符串变量,使用前得实例化。StringBuffer继承自抽象类AbstractStringBuilder,同样不能被继承。它的对象被创建后内容就不能变了。内部方法线程安全,方法有synchronized修饰 使用方法如下: 线程安全证明如下: 3、StringBuilder跟StringBuilder一样是字符串变量,类继承自抽象类AbstractStringBuilder,同样不能被继承。不过与StringBuffer不同的是它的内部方法没有synchronized修饰,即非线程安全的 4、线程安全补充 线程安全会更加消耗系统资源,因此StringBuilder的效率比StringBuffer高。 (1)在万级的使用里面几乎没有差距 (2)在十万级,效率差距逐渐显现,StringBuilder效率逐渐占上风 (3)在亿级以后,两者差距不大,不过StringBuilder稍微快些 (4)在占用内存方面,在百万级别以后