自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 资源 (6)
  • 收藏
  • 关注

原创 单进程单线程请求处理的Redis快在哪里

Redis为什么快1、完全基于内存2、数据结构简单,对数据操作也简单3、使用单进程单线程处理请求,避免了不必要的CPU的切换、死锁问题及其他多进程多线程可能出现的问题。4、使用多路I/O复用模型 Redis为什么是单线程的因为Redis是基于内存的操作,CPU并不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。又由于单线程容易实现,所以就顺理成...

2019-01-13 16:08:43 255

原创 eclipse搭建SSM maven环境

工程结构 action类package com.dongruan.action;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model...

2018-07-21 20:22:14 225

原创 Exchanger

    java.util.concurrent包下Exchanger<T>类可以实现两个线程之间的数据交换,其中参数T是泛型,表示交换的对象类型。     Exchanger<T>只有一个无参构造器,Exchanger()。     有两个重载方法exchange(V x)和exchange(V x, long timeout, Timeunit, unit)。作用是等待...

2018-03-08 23:45:58 222

原创 Semaphore

    Semaphore是JDK1.5位于java.util.concurrent包下的一个计数信号量。Semaphore通常用于限制可以访问某些资源的线程数目。它内部维护了一个许可集。在许可可用之前会阻塞每一个acquire(),然后再获取该许可;每个release()可以添加一个许可,从而可能释放一个正在阻塞的获得者。     Semaphore有两个构造器,Semaphore(int pe...

2018-03-07 20:57:25 271

原创 同步之Semaphore信号量

    基于Semaphore的特点,如果将信号量初始化为1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。     下面将使用Semaphore来实现买票的例子,可参考《同步之synchronized关键字》以了解该问题。package com.gk.thread.mutex.semaphore;import java.util.concurrent.Semaphore;...

2018-03-07 20:53:08 313

原创 CyclicBarrier

    前篇文章介绍的CountDownLatch可以用来倒计数,适用于一个线程等待多个线程的情况。如果要实现多个线程互相等待的效果,此时CyclicBarrier就比较合适了。     与CountDownLatch一样,CyclicBarrier也是JDK1.5位于java.util.concurrent包下的一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(common bar...

2018-03-06 20:29:56 266

原创 CountDownLatch

    CountDownLatch是JDK1.5位于java.util.concurrent包下的一个同步辅助类,利用它利用实现类似计数器的功能。比如有一个任务A,它要等待其他所有任务执行完毕之后才能执行,这时我们就可以使用CountDownLatch来实现这种功能了。     CountDownLatch只有一个带参的构造器CountDownLatch(int count),其中参数count...

2018-03-05 20:56:10 311

原创 生产者消费者模式之BlockingQueue

    前两篇关于生产者消费者模式的文章(《生产者消费者模式之synchronized与Object》,《生产者消费者模式之Lock与Condition》)介绍的都是比较传统的等待唤醒机制,即缓冲区有资源的时候就唤醒消费者消费,否则消费者就等待;缓冲区空的时候就唤醒生产者生产,否则生产者就等待。在这种机制下缓冲区最多只有一个资源供消费者消费,而且需要我们手动的控制等待和唤醒,比较麻烦,也容易出错。...

2018-02-15 23:03:20 324

原创 Condition

       在上一篇博客《生产者消费者模式之Lock与Condition》中已经对Condition的使用有所了解了,下面再举一个之前在网上看过的例子作为Condition的补充。     问题:假设有三个线程,一个主线程mainThread和两个子线程subThread1、subThread2,要求按顺序输出,mainThread先输出1——3,然后subThread1输出4——6,最后sub...

2018-02-15 17:49:39 1387

原创 生产者消费者模式之Lock与Condition

        在synchronized中解决线程间通信的生产者消费者问题可以使用Object类的wait()和notify()/notifyAll()方法(可参考),但是我在《同步之Lock锁》中说过Lock是对synchronized的一种更为面向对象的替代,如果我们使用Lock来解决生产者消费者问题又将怎样编写代码呢?在JDK1.5中提供的Condition配套Lock可以实现相同的功能,...

2018-02-15 17:26:24 682

原创 生产者消费者模式之synchronized与Object

    我在《同步之synchronized关键字》中举了一个春运卖票的例子,在这个例子中实现了使用线程来同时运行多个任务时,通过使用锁(互斥)来同步两个任务的行为,从而使得一个线程不会干涉另一个线程的资源。也就是说,如果两个线程在交替着步入某项共享资源,可以使用互斥来使得任意时刻只有一个线程可以访问这项资源。     虽然这个问题已经得到了解决,但是现实中卖票应该是这样的:首先先产生了票,然后才...

2018-02-15 16:32:40 683

原创 死锁

    前面说过使用同步机制可以解决多线程安全问题,不过使用同步也是有代价的,比如有如下两个缺点:1、效率低下;2、在有同步嵌套的时候容易出现死锁。那么什么是死锁呢?死锁就是指有两个或多个线程在相互争夺资源的过程中发生的一种相互等待的现象。     java中发生死锁有如下四个必要条件:        1、互斥使用,即当资源被一个线程占有时。别的线程不能使用;        2、不可抢占,资源请求...

2018-02-15 12:22:01 224

原创 同步之Lock锁

    我在同步之synchronized关键字中说过synchronized真正起作用的是锁对象,不过这个“锁对象”却是隐式监视器锁,我们并不明确是在哪里加上了锁,在哪里释放了锁。为了更明确的表示这种锁的使用,我们可以使用JDK1.5提供的Lock。     在API中是这样介绍Lock的:Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构...

2018-02-15 11:26:19 639

原创 同步之synchronized关键字

    快过年了,相信很多朋友都准备在网上买票然后舒舒服服的回家过年吧,然而抢票难却让大伙都很郁闷。前几天跟一个在广州工作的朋友聊天的时候,他还说因为买不到高铁票而要骑自行车回家呢,虽然也不远,才400多公里,对吧。但不管怎样,中国人的传统,回家团圆。希望大家都能顺顺利利的回家跟家人团聚。      接下来进入正题,谈谈java的同步机制synchronized。在讲之前,让我们先来模拟一下买票情...

2018-02-15 02:07:25 344

原创 实现多线程的第三种方式之Callable

    前面在《java多线程基础》中说过,实现多线程有两种方式:一种是继承Thread类,另一种是实现Runnable接口。这两种方式中真正起作用的是run方法,不过run方法并没有返回值。如果我们希望任务在完成时能够有返回值,这时就可以使用JDK1.5提供的Callable接口了,Callable是一种具有类型参数的泛型,它的类型参数表示的是从call()方法中返回的值,可以使用Executo...

2018-02-14 21:39:17 427

原创 线程池

    我在线程组中简单的介绍了线程组,虽然事实证明线程组是一个失败的尝试,不过它却给我们提供了另一种思路,既然可以把线程编组进行统一管理,是不是也可以把线程放在一个池子里供我们使用呢?因为我们知道每次新建一个线程的代价是很大的,要涉及到与操作系统进行交互,资源开销很大,如果使用线程池的话就可以很好的提高性能了。     我们可以这样设计,程序中的线程运行结束后不是马上死亡被gc回收,而是重新回到...

2018-02-14 21:16:48 191

原创 线程组

    记得我们在上学的时候,每学期上课之前老师都会给我们分组,很明显分组的目的就是为了方便管理。同理,当线程很多的时候我们也可以给线程分组以方便我们对线程的同一管理。     看似有了线程组还是蛮方便的,不过线程组已经过时了,它并没有提供太多有用的功能,而且它提供的许多功能还都是有缺陷的。就像Joshua Bloch(《Effective Java》的作者、java集合框架的创始人)说的:“最好...

2018-02-14 19:28:20 423

原创 java多线程基础

    本文主要讲java多线程的一些入门知识,包括线程的创建、调度、优先级、等待、休眠、中断及守护线程等...,在讲之前让我们先建立一个“数据字典”以简单了解多线程中出现的一些名词。     进程:进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础。可以简单的理解为运行中的应用程序。    多进程:允许计算机“同时”运行多个进程(应用程序)以提高CPU的利用率。    线程:线程是进程...

2018-02-13 22:00:22 404

原创 复制文件夹

 思路:先判断源目录sourceFolderPath存不存在,如果不存在则抛出异常结束程序的执行。如果存在,又因为目标目录可能不存在,所以先使用File类的mkdirs()创建目标目录targetFolderPath,不然会抛出FileNotFoundException;然后使用File类的listFiles()方法获取源目录sourceFolderPath下的所有文件或文件夹,判断,如果是文件则...

2018-02-08 18:17:18 193

原创 java异常那些事

在我们的程序设计中,对异常的处理是一种司空见惯的情况了。一个程序异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度,试想一下,如果一个项目从头到尾没有考虑过异常处理,那么当程序出现问题的时候我们怎么解决呢?所以,充分发挥异常的优点,可以提高程序的可读性、可靠性和可维护性,如果使用不当,又会严重影响到代码质量以及程序的性能。本文主要简单的介绍java异常的基础知识,然后根据《Eff

2018-02-07 14:34:49 230

原创 标准输入输出流

相信很多人在刚开始学习java的时候,使用的第一个语句就是System.out.println("hello world");那时候我们也没多想,照着书上打,然后就奇迹般的在我们机器的显示器上显示了“hello world”,虽然很简单,但是也让我们高兴了好久,自己终于会用java了。。。  然而,或许到现在我们也没有理会System.out到底是什么。其实System.out是jav

2018-02-04 14:51:01 1268

原创 IO流之随机访问文件流

RandomAccessFile是一个比较有趣的流,它既不独属于输入流又不独属于输出流,而是这两者的“结合体”,因为它既能读又能写。跟DataInputStream和DataOutputStream一样,RandomAccessFile也实现了DataInput和DataOutput接口,所以也能操作基本数据类型的数据。在它的构造器public RandomAccessFile(String 

2018-02-04 14:02:38 302

原创 java -- IO流之字符流

在我的上一篇博客java -- IO流之字节流中已经介绍了java IO流中常见的字节流,字节流中大部分类都是JDK1.0出现的。在JDK1.1中对基本的IO流类库进行了重大的修改,出现了字符流Reader和Writer。 其实JDK1.1设计Reader和Writer继承层次结构主要是为了国际化。字节流仅支持8位的字节,并不能很好地处理16位的Unicode字符。由于Unicod

2018-02-04 02:49:53 224

原创 java -- IO流之字节流

Java类库中的IO类,可以从不同的角度将其进行不同的分类。比如按数据的流向可分分为输入流和输出流;按数据处理单位的不同,又可将其分为字节流和字符流。但不管怎样分,其本质都是一样的。本人更倾向将其分成字节流和字符流,再在字节流和字符流里面讨论输入流和输出流。 必须要知道的的是,输入输出是相对于“程序”来说的,从物理学方面来讲就是以“程序”为参照物:从程序中流向外部的数据就叫“输出流

2018-02-03 19:31:46 441

原创 IO流之File类的概述

IO流操作中大部分都是对文件的操作,所以Java就提供了File类给我们来操作文件。File类以抽象的方式表示文件名和目录路径名。该类主要用于文件和目录的创建、文件的删除、属性、重命名和获取等功能。下面将针对这些功能一一演示。  这里大家必须明白一个概念,其实目录就是文件夹。 构造器:File类提供了4个构造方法给我们使用。1、通过一个路径字符串创建File对象:Fil

2018-01-29 01:41:46 224

原创 关于JDBC操作的小小总结

JDBC(Java DataBase Connectivity)java数据库连接,是一种用于执行SQL语句的Java API(Application Programming Interface),可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。 有了JDBC,在我们的程序中向各种关系型数据库发送SQL语句就是一件很容易的事了。也就是说,程序员不必为了

2018-01-28 00:01:08 439

原创 关于Java反射机制的总结

关于Java的反射机制,百度百科上是这样解释的:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。从百度百科的解释中,我们可以知道反射其实就是可以动态的获取任意一个类的所有属性和方法,包括私有的。下面我们就通过几个简单的例子来学习反射的基本用法。

2017-07-23 01:32:32 288

原创 遍历D盘

刚刚学了IO流中的文件操作,然后就想着能不能现实一个类似于系统提供的文件搜索。于是就开始动手做了,刚开始思路还是很清晰的,就是用递归遍历某个盘符(我这里递归遍历的是D盘)。代码写好了,运行之后问题就出来:NullPointerException。重新看了代码之后也看不出什么问题,也请教了老师,老师也觉得代码是没问题的,但是运行的时候就是出现NullPointerException。(崩溃啊。。

2017-05-27 17:43:34 1073

原创 Hello World

哈哈,这是我第一次在CSDN上写博客。public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }

2017-05-27 17:27:37 249

阿里巴巴 Java 开发手册

阿里巴巴 Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总 结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大 开发者

2019-01-14

Redis设计与实现

快速、有效的了解Redis内部构造以及运作机制,内容简单,通俗易懂

2019-01-14

jQueryAPI1.4

jQueryAPI1.4,jQueryAPI1.4,jQueryAPI1.4,jQueryAPI1.4。

2018-02-17

JDK_API1.6中文版

JDK_API1.6中文版,JDK_API1.6中文版,JDK_API1.6中文版,JDK_API1.6中文版。

2018-02-17

《java异常那些事》代码

这是《java异常那些事》的所有示例代码,可以下载参考

2018-02-07

Effective Java 第2版_中文版 PDF电子书下载

Effective Java(第2版)介绍了在java编程中78条极具实用的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰、健壮和高效的代码。

2018-02-06

空空如也

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

TA关注的人

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