
多线程
文章平均质量分 77
that_is_cool
I know you are wrong,but that's cool
展开
-
多线程入门(四):原子Integer,final,以及线程安全的有序性
首先说说,原子Integer的意义,也就是AtomicInteger类,这是JDK1.5之后提供的一个类,相似的还有Atomic**,他的意义是为了实现Integer进行加减的原子性。 当我们执行i++或者++i时,实际上都是在执行两步操作,将i取到“工作内存”,加1,然后写回主内存,在单线程环境下,是安全的,但是多线程环境下,显然是不安全的,AtomicInteger类提供具有原子...原创 2018-04-30 15:36:21 · 1308 阅读 · 0 评论 -
ConCurrentHashMap的实现原理
ConCurrentHashMap的实现原理原创 2018-06-06 16:45:17 · 217 阅读 · 0 评论 -
CAS和ABA问题
CAS和ABA问题 引言:乐观锁和悲观锁的概念 悲观锁:悲观锁悲观地认为,自己执行操作的过程中一定有人修改过自己操作的值,所以在自己操作之前会加上一把锁,synchronized就是一个悲观锁。 乐观锁:乐观锁则乐观地认为,当自己执行操作时不会有人修改自己操作的值,所以采用不加锁的机制,只是在操作完成的那一刻发现产生冲突,则会重新执行操作,直到成功为止。CAS算法就是乐观锁的一种...原创 2018-06-05 22:30:55 · 3141 阅读 · 0 评论 -
Servlet/JSP、Struts1、Struts2以及SpringMVC的线程安全性
Servlet/JSP、Struts1、Struts2以及SpringMVC的线程安全性 一、Servlet/JSP Servlet/JSP一直都是MVC界的老大哥,我们来回顾一下Servlet的生命周期。 当客户端第一次请求Servlet时,Web容器会根据web.xml中的配置文件创建一个Servlet实例,而后调用init()方法,仅一次(注意);之后每一次请求都会执行Se...原创 2018-05-29 19:44:06 · 684 阅读 · 0 评论 -
多线程入门(三):线程间的通信wait以及notify
文章开始前,我们再次来了解一下synchronize的锁机制,所谓对象锁,任何一个对象都可以成为锁,一个对象有两个状态,在被使用和未被使用。synchronize加了参数以后代表使用参数中的对象当锁,其他使用该对象当锁的代码被调用了,就得看锁的状态了,如果锁被上锁了(其他使用该对象当锁的代码正在执行),则必须等待锁的获得。 所以,当锁为this时,当前对象作为锁,当锁为class对象...原创 2018-04-29 19:02:51 · 160 阅读 · 0 评论 -
多线程入门(二):线程安全的可见性以及volatile关键字
上文说到线程安全的两个特性,一是原子性,而是可见性,什么是可见性呢? //不可见性 在多个线程操作同一个变量时,其它线程对一个线程的变量操作是不可见的,原因就涉及到JVM的内存模型了。 在介绍JVM内存模型时,我们经常提到内存为线程私有,所谓的线程私有,就是在线程运行时,JVM会为线程开辟一块专属于该线程的“工作内存”,用于存放栈内存,同时也将线程需要用到的主内存中的变量...原创 2018-04-29 17:59:03 · 432 阅读 · 0 评论 -
多线程入门(一):线程安全和synchronize关键字的使用
//开篇解释线程安全大概 什么是线程安全,指的就是,当多个线程访问同一个资源(这个资源很泛泛,有可能是一个对象的一个方法,也有可能是一个类的方法)时,相互之间不会产生影响,表现出正确的行为时,谓之线程安全。 //解释synchronize关键字的使用大概 synchronize关键字我们并不陌生,被synchronize关键字修饰的代码或者方法,会被有一把“同步锁”,只有...原创 2018-04-29 14:51:59 · 450 阅读 · 0 评论 -
BIO、NIO、AIO的区别
BIO、NIO、AIO的区别 一、BIO(同步阻塞IO) 网络编程的模型其实就是C/S模型,即两个进程间的通信。BIO编程则提供最传统的一种IO网络编程方式,优点是API使用简单,易于理解。 BIO的模型是让服务器端提供一个端口号,新建一个ServerSocket套接字对象,客户端可以通过URL和端口号与服务器建立TCP连接,服务器端和客户端通过套接字来通信,在该模型中需要服务器...原创 2018-05-06 19:45:35 · 168 阅读 · 0 评论 -
ThreadLocal深入浅出
ThreadLocal深入浅出 一、分析ThreadLocal源码 ThreadLocal的核心方法一共就几个,get(),set()等等,我们由get()开始,一边分析其源码,一边揭开ThreadLocal的面纱。 先看看JDK7中的get()源码: public T get() { Thread t = Thread.currentThread(); ...原创 2018-05-03 18:31:18 · 158 阅读 · 0 评论 -
Java的Lock锁和synchronized关键字的区别及其使用
Java的Lock锁和synchronized关键字的区别及其使用 一、synchronized关键字和Lock的区别以及优缺点 我们可以回顾一下synchronized的使用,synchronized释放锁的时机有以下几种:当执行完代码块中的代码,释放锁;当代码抛出异常,释放锁;当调用锁的wait方法,释放锁; 以上三种情况便可以完全的帮我们解决线程同步的问题,为什么还要引入L...原创 2018-05-02 18:21:50 · 1752 阅读 · 0 评论 -
并发包下一些并发类
并发包下一些并发类 引言:JDK1.5的并发包不仅仅提供了前文所说的线程池框架,还提供了一系列并发类,来便于我们编写高并发代码,本文我们来一一介绍。 一、CountDownLatch类 代码如下:package com.example.first;import java.util.concurrent.CountDownLatch;import java.util.conc...原创 2018-05-01 18:24:15 · 1176 阅读 · 0 评论 -
详解线程池
详解线程池 引言:在最早的时候有写过关于线程池的文章,针对四种不同的线程池,讲解了他们的特性,本文将更加深入,从源码来解释四种不同的线程池框架。 一、线程池的作用以及好处 在JDK1.5以前,线程池的使用是十分简陋的,直到JDK1.5,在并发包下,才出现了现如今的线程池。 线程池的作用是控制线程的数量,因为每一个线程都会占用系统的内存,以及在运行时,会争夺CPU的使...原创 2018-05-01 15:51:48 · 168 阅读 · 0 评论 -
多线程并发编程的三种设计模式:Future模式,MasterAndWorker模式,生产者消费者模式
Future模式,核心概念就是将任务异步执行,然后继续做自己主任务,最后需要结果的时候,将异步执行的结果取出。常见的实现就有ajax异步传输,使用异步线程提交数据,不影响主线程,当返回结果的时候再回调给主线程。java中常常会有一些任务十分冗长,可能需要长时间的计算,但是此计算的结果可能并不会被接下来的步骤所依赖,只需要在需要计算结果的时候返回给主线程就行了,这个时候,多线程就起到了作用,...原创 2018-05-01 12:54:44 · 422 阅读 · 0 评论 -
科普:同步容器以及并发容器
经典的同步容器有HashMap以及Vector,底层的实现机制无非就是使用synchronized关键字对每一个方法进行修饰,保证容器操作的同步,但是性能很低,无法满足现如今互联网时代的高并发要求。 JDK5.0以后便开始使用并发类容器来替代同步类容器,原因是同步容器虽然实现了线程安全,但是基本上一次访问只能有一个线程在操作,极大的降低了效率和并发性,所以慢慢的使用Concurren...原创 2018-04-30 17:48:35 · 261 阅读 · 0 评论 -
CopyOnWrite容器解决的并发问题
CopyOnWrite容器解决的并发问题 先看这么一段代码: public static void main(String[] args) throws InterruptedException { List<String> a = new ArrayList<String>(); a.add("a"); a.ad...原创 2018-06-06 17:35:42 · 491 阅读 · 0 评论