自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 如何实现一个简单的RPC

RPC的实现原理  正如上一讲所说,RPC主要是为了解决的两个问题:解决分布式系统中,服务之间的调用问题。 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。还是以计算器Calculator为例,如果实现类CalculatorImpl是放在本地的,那么直接调用即可:现在系统变成分布式了,CalculatorImpl和调用方不在同一个地址空间,那么就必须要进行...

2018-12-28 20:49:05 270

原创 图解集合7:红黑树概念、红黑树的插入及旋转操作详细解读

初识TreeMap     之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增、删、改、查,从存储角度考虑,这两种数据结构是非常优秀的。另外,LinkedHashMap还额外地保证了Map的遍历顺序可以与put顺序一致,解决了HashMap本身无序的问题。    尽管如此,HashMap与LinkedHashMap还是有自己...

2018-12-28 10:38:18 552

原创 fail-fast机制

在JDK的Collection中我们时常会看到类似于这样的话:例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测...

2018-12-28 09:46:40 144

原创 图解集合6:LinkedHashMap

初识LinkedHashMap     上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见、非常有用的集合,并且在多线程情况下使用不当会有线程安全问题。      大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。...

2018-12-27 21:02:27 150

原创 图解集合5:不正确地使用HashMap引发死循环及元素丢失

问题引出 前一篇文章讲解了HashMap的实现原理,讲到了HashMap不是线程安全的。那么HashMap在多线程环境下又会有什么问题呢?       几个月前,公司项目的一个模块在线上运行的时候出现了死循环,死循环的代码就卡在HashMap的get方法上。尽管最终发现不是因为HashMap导致的,但却让我重视了HashMap在多线程环境下会引发死循环的这个问题,下面先用一段代码简单模拟出Ha...

2018-12-27 20:31:45 163

原创 图解集合4:HashMap

初识HashMap之前的List,讲了ArrayList、LinkedList,最后讲到了CopyOnWriteArrayList,就前两者而言,反映的是两种思想:(1)ArrayList以数组形式实现,顺序插入、查找快,插入、删除较慢(2)LinkedList以链表形式实现,顺序插入、查找较慢,插入、删除方便那么是否有一种数据结构能够结合上面两种的优点呢?有,答案就是HashMa...

2018-12-27 19:29:33 185

原创 图解集合3:CopyOnWriteArrayList

初识CopyOnWriteArrayList       第一次见到CopyOnWriteArrayList,是在研究JDBC的时候,每一个数据库的Driver都是维护在一个CopyOnWriteArrayList中的,为了证明这一点,贴两段代码,第一段在com.mysql.jdbc.Driver下,也就是我们写Class.forName("...")中的内容:public class ...

2018-12-27 16:45:51 131

原创 图解集合2:LinkedList

初识LinkedList上一篇中讲解了ArrayList,本篇文章讲解一下LinkedList的实现。       LinkedList是基于链表实现的,所以先讲解一下什么是链表。链表原先是C/C++的概念,是一种线性的存储结构,意思是将要存储的数据存在一个存储单元里面,这个存储单元里面除了存放有待存储的数据以外,还存储有其下一个存储单元的地址(下一个存储单元的地址是必要的,有些存储结构还...

2018-12-27 15:56:10 269

原创 图解集合1:ArrayList

前言      这个分类中,将会写写Java中的集合。集合是Java中非常重要而且基础的内容,因为任何数据必不可少的就是该数据是如何存储的,集合的作用就是以一定的方式组织、存储数据。这里写的集合,一部分是比较常见的、一部分是不常用但是我个人平时见到过的,一些比较相似的集合(比如HashMap和Hashtable)就只讲一个,突出它们之间的区别即可。最后,要指出一点,对于集合,我认为关注的点...

2018-12-27 11:07:49 276

原创 Java中sleep()与wait()区别

       1、每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);      wait()方法则是指当前线程让自己暂时退让出同步资源...

2018-12-27 10:11:32 3057

原创 Java多线程20:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask

CyclicBarrier        接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier。CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都达到了这个屏障时,再一起继续执行后面的动作。看一下CyclicBarrier的使用实例:public static class CyclicBarrierThread...

2018-12-27 10:11:16 143

原创 Java多线程19:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger

前言      在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码。之前讲过的线程池、BlockingQueue都是在java.util.concurrent下的组件,Timer虽然不在java.util.concurrent下,但也算是。后两篇文章将以例子的...

2018-12-27 10:11:00 168

原创 Java多线程18:定时器Timer

前言         定时/计划功能在Java应用的各个领域都使用得非常多,比方说Web层面,可能一个项目要定时采集话单、定时更新某些缓存、定时清理一批不活跃用户等等。定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程方式进行处理,所以它和多线程技术关联还是相当大的。那和ThreadLocal一样,还是先讲原理再讲使用,Timer的实现原理不难,就简单扫一下就好了。...

2018-12-27 10:10:44 127

原创 Java多线程17:线程池

使用线程池与不使用线程池的差别先来看一下使用线程池与不使用线程池的差别,第一段代码是使用线程池的:public static void main(String[] args){ long startTime = System.currentTimeMillis(); final List<Integer> l = new LinkedList<Inte...

2018-12-26 20:03:54 294

原创 Java多线程16:中断机制

概述       之前讲解Thread类中方法的时候,interrupt()、interrupted()、isInterrupted()三个方法没有讲得很清楚,只是提了一下。现在把这三个方法同一放到这里来讲,因为这三个方法都涉及到多线程的一个知识点----中断机制。      Java没有提供一种安全、直接的方法来停止某个线程,而是提供了中断机制。中断机制是一种协作机制,也就是说通过中断并...

2018-12-26 17:32:47 175

原创 Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型

Queue是什么      队列,是一种数据结构。除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的。无论使用哪种排序方式,队列的头都是调用remove()或poll()移除元素的。在FIFO队列中,所有新元素都插入队列的末尾。Queue中的方法Queue中的方法不难理解,6个,每2对是一个也就是总共3对。看一下JDK API就知道了:注意...

2018-12-26 17:04:10 173

原创 生产者消费者问题的几种实现

synchronized实现生产者消费者模型 ReentrantLock实现生产者消费者模型 BlockingQueue实现生产者消费者模型 Semaphore实现生产者消费者模型      生产者消费者问题是一个经典的问题,一般情况下都会使用synchronized关键字来对生产和消费逻辑进行加锁 ,最近学习了下并发编程相关的基础知识,尝试使用其它的几种方法来实现生产者和消费者模型。...

2018-12-26 16:47:31 571

原创 Java多线程14:生产者/消费者模型

什么是生产者/消费者模型一种重要的模型,基于等待/通知机制。生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点:生产者生产的时候消费者不能消费 消费者消费的时候生产者不能生产 缓冲区空时消费者不能消费 缓冲区满时生产者不能生产由于缓冲区是临界资源,它只允许一个生产者放入消息,也只允许一个消费者拿出...

2018-12-26 16:31:14 182

原创 Java多线程13:读写锁和两种同步方式的对比

读写锁ReentrantReadWriteLock概述        大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低。所以在JDK中提供了一种读写锁ReentrantReadWriteLock,使用它可以加快运行效率。     读写锁表示两个锁,一个是读操作相关的锁,称为共享...

2018-12-26 16:14:08 127

原创 Java多线程12:ReentrantLock中的方法

公平锁与非公平锁        ReentrantLock有一个很大的特点,就是可以指定锁是公平锁还是非公平锁,公平锁表示线程获取锁的顺序是按照线程排队的顺序来分配的,而非公平锁就是一种获取锁的抢占机制,是随机获得锁的,先来的未必就一定能先得到锁,从这个角度讲,synchronized其实就是一种非公平锁。非公平锁的方式可能造成某些线程一直拿不到锁,自然是非公平的了。看一下例子,new Ree...

2018-12-26 15:33:56 89

原创 Java多线程11:ReentrantLock的使用和Condition

ReentrantLock      ReentrantLock,一个可重入的互斥锁,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。ReentrantLock基本用法public class ThreadDomain38{ private Lock lock = new ReentrantLock(); ...

2018-12-26 15:05:00 134

原创 Java多线程10:ThreadLocal的作用及使用

       从上一篇对于ThreadLocal的分析来看,可以得出结论:ThreadLocal不是用来解决共享对象的多线程访问问题的,通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是线程自己要存储的对象,其他线程不需要去访问,也是访问不到的。各个线程中的ThreadLocal.ThreadLocalMap以及ThreadLocal....

2018-12-26 11:10:00 115

原创 Java多线程9:ThreadLocal源码剖析

        除了控制访问外 我们还可以通过增加资源来保证所有对象的线程安全。如果说锁是第一种思路那么ThreadLocal就是第二种思路了。threadLocal是一个线程局部变量的类,使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。(线程安全,可以使用threadLocal为每一个线程都产生一个实例。保证这些对象只被当前线程所访问。)ThreadLoca...

2018-12-26 10:45:21 120

原创 Java多线程8:wait()和notify()/notifyAll()

轮询线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作。想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办法就是,B线程while(i == 10000),这样两个线程之间就有了通信,B线程不断通过轮询来检测i == 10000这个条件。这样可以实现我们的需求,但是也带来了问题:CPU把...

2018-12-25 19:27:43 155

原创 死锁的必要条件和解决方法

什么是死锁      在多道程序设计环境中,若干进程往往要共享这类资源,而且一个进程所需要的资源不止一个。这样,就会出现若干进程竞争有限资源,又推进顺序不当,从而构成无限期循环等待的局面。这种状态就是死锁。系统发生死锁现象不仅浪费大量的系统资源,甚至导致整个系统崩溃,带来灾难性后果。所以,对于死锁问题在理论上和技术上都必须给予高度重视。      死锁是进程死锁的简称,是由Dijkst...

2018-12-25 19:10:25 4249

原创 Java多线程7:死锁

前言      死锁单独写一篇文章是因为这是一个很严重的、必须要引起重视的问题。这不是夸大死锁的风险,尽管锁被持有的时间通常很短,但是作为商业产品的应用程序每天可能要执行数十亿次获取锁->释放锁的操作,只要在这数十亿次操作中只要有一次发生了错误,就可能导致程序中发生死锁,并且即使通过压力测试也不可能找出所有潜在的死锁。死锁一个经典的多线程问题。      当一个线程永远地持有...

2018-12-25 17:33:24 102

原创 Java多线程6:synchronized锁定类方法、volatile关键字及其他

同步静态方法       Synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁。看一下例子,注意一下printC()并不是一个静态方法:public class ThreadDomain25{ public synchronized static void printA() { try ...

2018-12-25 17:23:12 115

原创 Java多线程5:synchronized锁方法块

synchronized同步代码块     用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间。这种情况下可以尝试使用synchronized同步语句块来解决问题。看一下例子:      public class ThreadDomain18{ public void doLongTime...

2018-12-25 16:54:32 123

原创 Java多线程4:synchronized锁机制

脏读       一个常见的概念。在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的。多线程线程安全问题示例看一段代码:public class ThreadDomain13{ private int num = 0; public void ...

2018-12-25 16:19:10 90

原创 Java多线程3:Thread中的静态方法

Thread类中的静态方法      Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程"。为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作。下面来看一下Thread类中的静态方法:1、currentThread()currentThread()方法返回的是对当前正在执行线程对象的引用。看一个重要的例子,然后得出结论:pu...

2018-12-25 15:53:51 240

原创 Java多线程2:Thread中的实例方法

Thread类中的方法调用方式:     学习Thread类中的方法是学习多线程的第一步。在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别:1、this.XXX()         这种调用方式表示的线程是线程实例本身2、Thread.currentThread.XXX()或Thread.XXX()        ...

2018-12-25 15:22:44 129

原创 Java多线程1:进程与线程概述

进程和线程一、进程的定义      进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。      进程可以理解为受操作系统管理的基本运行单元。360浏览器是一个进程、WPS也是一个进程,正在操作系统中运行的".exe"都可以理解为一个进程。      进程一般有三个状态:就绪状态、执行状态和等待状态【或称阻塞...

2018-12-25 14:29:41 430

原创 ServerSocket 和 Socket 通信实例

     以下实例演示了如何实现客户端发送消息到服务器,服务器接收到消息并读取输出,然后写出到客户端客户端接收到输出。Socket类的构造函数如下:     Socket()  通过系统默认类型的 SocketImpl 创建未连接套接字          Socket(InetAddress address, int port)   创建一个流套接字并将其连接到指定 IP 地址的指定端口...

2018-12-24 19:42:48 1693

原创 什么是套接字(Socket)

      应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。       生成套接字,主要有3个参数:通信的...

2018-12-24 19:34:41 913

原创 Java IO8:IO简单总结

字节流、字符流继承关系        前几篇文章讲解了字节流、字符流的使用,不过Java提供给用户的流类远不止此,限于篇幅原因,没办法一一讲解,而且也没有必要一一讲解,就像我在写博客的时候多次提到的,有问题的时候学会查JDK API即可。OK,虽然不一一讲解每种流,我自己简单画了几张UML图,说明一下字节输入流、字节输出流、字符输入流、字符输出流这四个流类的子类继承关系。1、字节输入流...

2018-12-24 17:20:50 119

原创 Java IO7:管道流、对象流

前言       前面的文章主要讲了文件字符输入流FileWriter、文件字符输出流FileReader、文件字节输出流FileOutputStream、文件字节输入流FileInputStream,这些都是常见的流类。当然除了这些流类之外,Java还提供了很多的流类给用户使用,本文就看一下别的流。管道流         管道流主要用于连接两个线程的通信。管道流也分为字节流(Pipe...

2018-12-24 17:10:00 113

原创 Java IO6:字符流进阶及BufferedWriter、BufferedReader

字符流和字节流的区别拿一下上一篇文章的例子:public static void main(String[] args) throws Exception{ File file = new File("D:/writer.txt"); Writer out = new FileWriter(file); // 声明一个String类型对象 String ...

2018-12-24 16:48:20 146

原创 Java IO5:字符流

字符流        字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,一个Unicode字符占用2个字节,而字节流一次只能操作一个字节。既然Java的口号就是"一次编写、处处运行",那么包含直接的字符输入/输出的支持是必要的。因此就有一些字符输入/输出流,之前已经说明过了,字符流顶层是R...

2018-12-24 16:00:24 87

原创 Java IO4:字符编码

前言      字符编码,这本不属于IO的内容,但字节流之后写的应该是字符流,既然是字符流,那就涉及一个"字符编码的"问题,考虑到字符编码不仅仅是在IO这块,Java中很多场景都涉及到这个概念,因此这边文章就专门详细写一下字符编码,具体的网上有很多,但本文目的是尽量讲清楚各种编码方式的作用,个人认为,不求、也没有必要对字符编码理解地多么深入。 字符集和字符编码    第一个概念就是字符...

2018-12-24 15:34:07 154

原创 Java IO3:字节流

流类     Java的流式输入/输出是建立在四个抽象类的基础上的:InputStream(字节输入流)、OutputStream(字节输出流)、Reader(字符输入流)、Writer(字符输出流)。它们用来创建具体的流式子类。尽管程序通过具体子类执行输入/输出操作,但顶层类定义了所有流类的基本通用功能。      InputStream和OutputStream为字节流设计,Reade...

2018-12-24 10:49:27 209

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除