自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

java的平凡之路

博客的文章都是平时学习或者遇到其他人写的不错的文章分享,也是做一个记录,希望大家喜欢

  • 博客(920)
  • 资源 (3)
  • 收藏
  • 关注

转载 虚拟机内的锁优化(偏向锁,轻量级锁,自旋锁,重量级锁)

基础知识之一:锁的类型锁从宏观上分为:(1)乐观锁;(2)悲观锁。(1)乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取的方式是在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java中的乐观锁基本都...

2018-06-05 10:28:53 148

转载 轻松学习java可重入锁(ReentrantLock)的实现原理

前言相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么实现的。如果真是这样,而且你有兴趣了解,今天我将带领你轻松的学习下java中非常重要,也非常基础的可重入锁-ReentrantLock的实现机制。听故事把知识掌握了在一个村子里面,有一口井水,水质非常的...

2018-05-31 11:35:55 162

转载 Java并发包基石-AQS详解

目录    1 基本实现原理      1.1 如何使用       1.2 设计思想    2 自定义同步器      2.1 同步器代码实现       2.2 同步器代码测试    3 源码分析      3.1 Node结点       3.2 独占式       3.3 共享式    4 总结  Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如Ree...

2018-05-30 18:21:03 889

转载 【多线程高并发】多线程的设计模式

关键字::多线程设计模式,Future模式,Master-Worker模式,生产者-消费者模型 github 地址: https://github.com/zhaikaishun/concurrent_programming 本篇文章代码在Multi_004 中多线程的设计模式代码在Multi_004当中 并行设计模式属于设计优化的一部分,他是对一些常用的多线程结构的总结和抽象,与串行程序相比,并...

2018-05-30 10:43:33 1649

转载 java 多线程并发系列之 生产者消费者模式的两种实现

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费...

2018-05-30 09:27:43 332

转载 理解线程池的原理

读完本文你将了解:什么是线程池线程池的处理流程保存待执行任务的阻塞队列创建自己的线程池JDK 提供的线程池及使用场景newFixedThreadPoolnewSingleThreadExecutornewCachedThreadPoolnewScheduledThreadPool两种提交任务的方法executesubmit关闭线程池如何合理地选择或者配置总结Thanks什么是线程池线程池的概念大家...

2018-05-29 10:49:48 159

转载 JVM 并发性: 使用 Akka 执行异步操作

本 系列 中以前的文章介绍了如何通过以下方式实现并发性:并行地在多个数据集上执行相同的操作(就像 Java 8 流一样)显式地将计算构建成异步执行某些操作,然后将结果组合在一起(就像 future 一样)。这两种方法都是实现并发性的不错方式,但是您必须将它们明确地设计到应用程序中。在本文和接下来的几篇文章中,我将着重介绍一种不同的并发性实现方法,该方法基于一种特定的程序结构,与显式编码方法不同。这...

2018-05-28 18:24:24 3021

转载 Coroutine in Java - Quasar Fiber实现

简介说到协程(Coroutine),很多人会想到go,lua,erlang等语言,其实JVM上也有蛮多的实现,如PicoThread,Kilim,Quasar等,本文主要介绍其中一种Coroutine实现 -- Quasar Fiber,Quasar Fiber相对来说流行度更好一些,如果之前没有接触过协程(用户级轻量级线程),可以看下What are fibers、Coroutine那么为什么要...

2018-05-25 15:45:20 3616

转载 继续了解Java的纤程库 – Quasar

前一篇文章Java中的纤程库 – Quasar中我做了简单的介绍,现在进一步介绍这个纤程库。Quasar还没有得到广泛的应用,搜寻整个github也就pinterest/quasar-thrift这么一个像样的使用Quasar的库,并且官方的文档也很简陋,很多地方并没有详细的介绍,和Maven的集成也不是很好。这些都限制了Quasar的进一步发展。但是,作为目前最好用的Java coroutine...

2018-05-25 15:43:35 6468

转载 Java中的纤程库 – Quasar

最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题:服务 A 是我们开发的系统,它的业务需要调用 B、C、D 等多个服务,这些服务是通过http的访问提供的。 问题是 B、C、D 这些服务都是第三方提供的,不能保证它们的响应时间,快的话十几毫秒,慢的话甚至1秒多,所以这些服务的Latency比较长。幸运地是这些服务都是集群部署的,容错率和并发支持都比较高,所以不担心它们的并发性能,唯一不爽的...

2018-05-25 15:40:18 1138

转载 理解JMX之介绍和简单使用

近期在项目上需要添加一些功能,想把一个开源工程整合进来,虽说是整合,但是觉得跟开发有查不了多少,要让这个开源工程的编码风格和设计方式与我们的工程保持一致,其中涉及到应用程序的监控和管理,不可避免的要使用JMX,之前简单的了解过JMX,但是没有动力深入去了解其中的原理和编码,由于项目需要,这次针对JMX要深入总结一下,关于监控的内容,之前写过一篇系统监控之SNMP协议理解,纯属是科普文章,也没有编程...

2018-05-25 15:32:38 553

转载 Java JDK代理、CGLIB、AspectJ代理分析比较

前言什么是代理,在Design patterns In java这个本书中是这样描述的,简单的说就是为某个对象提供一个代理,以控制对这个对象的访问。在不修改源代码的基础上做方法增强,代理是一种设计模式,又简单的分为两种。静态代理:代理类和委托类在代码运行前关系就确定了,也就是说在代理类的代码一开始就已经存在了。动态代理:动态代理类的字节码在程序运行时的时候生成。静态代理先来看一个静态代理的例子,C...

2018-05-25 15:14:43 163

转载 gRPC线程模型分析

1. RPC线程模型1.1. BIO线程模型在JDK 1.4推出Java NIO之前,基于Java的所有Socket通信都采用了同步阻塞模式(BIO),这种一请求一应答的通信模型简化了上层的应用开发,但是在性能和可靠性方面却存在着巨大的瓶颈。因此,在很长一段时间里,大型的应用服务器都采用C或者C++语言开发,因为它们可以直接使用操作系统提供的异步I/O或者AIO能力。当并发访问量增大、响应时间延迟...

2018-05-25 14:37:41 9895 4

转载 浅谈我对协程的理解

一句话说明什么是线程:协程是一种用户态的轻量级线程。一句话并不能完全概括协程的全部,但是起码能让我们对协程这个概念有一个基本的印象。从硬件发展来看,从最初的单核单CPU,到单核多CPU,多核多CPU,似乎已经到了极限了,但是单核CPU性能却还在不断提升。server端也在不断的发展变化。如果将程序分为IO密集型应用和CPU密集型应用,二者的server的发展如下:IO密集型应用: 多进程->...

2018-05-25 11:43:48 4339 1

转载 进程和线程、协程的区别

现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来。python中有协程库gevent,py web框架tornado中也用了gevent封装好的协程。本文主要介绍进程、线程和协程三者之间的区别。一、概念  1、进程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程...

2018-05-25 11:28:45 1491

转载 内核态和用户态的区别

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序...

2018-05-25 11:06:02 1285

转载 jstat命令查看jvm的GC情况

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 注意!!!:使用的jdk版本是jdk8.   类加载统计: Loaded:加载class的数量Bytes:所占用空间大小Unloaded:未加载数量Bytes:未加载占用空间Time:时间   编译统计 Compiled:编译数量。Failed...

2018-05-24 11:49:57 16669

转载 java命令--jstat 工具使用

jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。一、介绍用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的...

2018-05-24 11:49:19 566

转载 Java常用分析工具之jmap

简介jmap是JDK中提供的一个用来监视进程运行中的jvm物理内存的占用情况的工具。该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量。当系统崩溃时,jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等。使用jmap会影响线上运行的应用,所以尽量不要在线上执行此命令。如果想dump堆信息,可以使用gcore命令,比jmap -dump快...

2018-05-24 11:39:17 1949

转载 使用jvisualvm通过JMX的方式远程监控JVM的运行情况

使用jvisualvm通过JMX的方式远程监控JVM的运行情况,步骤如下远程服务器的配置在启动java程序时加上如下几个参数-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.managemen...

2018-05-24 11:00:52 4058

转载 java-线程同步

线程世界出现了一把锁幸好还是又聪明人的,有人想到了一个解决问题的好方法。虽然不知道谁想到的注意,但是这个注意确实解决了一部分问题,解决的方案是加锁。你想要进行对一组加锁的代码进行操作吗?想的话就先去抢到锁,拿到锁之后就可以对被加锁的代码为所欲为了,倘若拿不到锁的话就只能在代码块门口等着,因为等的线程太多了,这还成为了一种社会现象(状态),该社会现象被命名为线程的阻塞。听上去很简单,但是实际上加锁有...

2018-05-24 09:23:53 154

转载 JVM进阶之GC(五)对象的内存分配和回收策略

简单回顾下JVM内存结构和垃圾回收器。JVM内存结构JVM内存主要由新生代、老年代、永久代构成。新生代(Young Generation):大多数对象在新生代中被创建,其中很多对象的生命周期很短。每次新生代的垃圾回收(又称Minor GC)后只有少量对象存活,所以选用复制算法,只需要少量的复制成本就可以完成回收。新生代内又分三个区:一个Eden区,两个Survivor区(一般而言),大部分对象在E...

2018-05-24 09:22:38 536

转载 通过jstack日志分析和问题排查

前段事件公司出现了一个严重故障(调用dubbo服务一直处于超时,整个服务系统发生雪崩,系统彻底访问不了),一开始怎么都找不到问题的根源,日志的表现形式是dubbo线程池用完了,那么具体是什么导致的没有找到,后然通过jstack日志分析才找到问题的根源,根源就是系统日志代码写有问题。通过这个故障我们来了解下如何通过jstack日志分析线上问题。首先了解下jstack简介jstack用于生成java虚...

2018-05-24 09:22:29 1512

转载 JVM查看命令

JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。    现实企业级Java开发中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露线程死锁锁争用(Lock Content...

2018-05-24 09:22:19 11024

转载 JVM进阶之GC(四)垃圾收集器

上一篇讲了下垃圾回收算法,今天就来说说垃圾回收算法的具体实现吧–垃圾收集器(本文讨论的是JDK1.7版本的HotSpot虚拟机)。垃圾收集器HotSpot虚拟机提供的收集器如下图:  新生代的垃圾收集器有:Serial、ParNew、Parallel Scavenge; 老年代的垃圾收集器有:CMS、Serial Old、Parallel Old G1收集器因运用的还不是很广泛,不予讨论,有兴趣的...

2018-05-23 11:14:59 909

转载 JVM进阶之GC(三)垃圾回收算法

上篇我们讨论了怎么判断对象是否存活,判了“死刑”的对象就会在垃圾回收中被回收掉。那么本文将说说JVM是如何回收垃圾的。垃圾回收算法标记-清除算法算法的过程就如同算法的名字,分为标记和清除两个阶段:首先标记出所有要回收的对象,然后对标记的对象统一清除。算法很简单,再看下逻辑图:  内存空间经过标记清除算法回收的过程一目了然,从图中也能看出这种算法的不足,即标记清除后会产生大量的不连续的内存碎片,如果...

2018-05-23 11:13:04 432

转载 JVM进阶之GC(二)对象存活判断算法

上一篇简单的说明了对象在JVM中的内存分代策略,此文继续来为GC打基础,说说什么样的对象需要被GC,即对象是否存活判定算法。判定对象存活算法如何判断对象沦为了垃圾也是门技术。引用计数法引用计数法就是给对象加个引用计数器,每有一个地方引用到它时,这个引用计数器就加1。当引用失效的时候,计数器的值就减1,也就是说根据引用计数器的值来判断对象是否存活,若值是0,那么该对象就不再被使用了。 真是如此吗?答...

2018-05-23 11:12:02 264

转载 JVM进阶之GC(一)内存分代

前言我们知道,java语言与c++语言最大的不同点就是在垃圾回收的处理上,java有了专门的垃圾自动回收机制,而c++需要手动回收内存垃圾。既然java的垃圾回收这么NB,那今天就来整理JVM的垃圾回收这块内容吧。首先得明确几点目的: 1. 为什么需要了解JVM的垃圾回收,让JVM自己去处理不就好了? 2. 是回收什么东西? 3. 是什么时候回收的? 4. JVM是怎么进行垃圾回收的?JVM内存分...

2018-05-23 11:10:26 1156

转载 JVM进阶之运行时数据区

前言  最近在看重温JVM相关的知识点,但总感觉看书很枯燥乏味,看别人的博客知识又显得零碎,知识体系不够系统,所以有必要把所见所闻所学的点,好好地梳理成文,加强自己理解程度的同时,挖掘自身的盲点。好了,鸡血不宜多,让我们开始JVM的新篇章。  话说平时开发中的我们有曾想过写过的代码运行在哪儿,比如在类中声明了static类型的变量,在方法中new了一个对象等等……如果这些都不了解,我只能说不是个合...

2018-05-23 11:09:38 112

转载 几张图轻松理解String.intern()

一、new String都是在堆上创建字符串对象。当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用。 二、通过字面量赋值创建字符串(如:String str=”twm”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串。 三、常量...

2018-05-23 10:58:56 125

转载 JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)

目录一、背景1.1 永久代(PermGen)在哪里?1.2 JDK8永久代的废弃 二、为什么废弃永久代(PermGen) 2.1 官方说明Motivation 2.2 现实使用中易出问题三、深入理解元空间(Metaspace)3.1元空间的内存大小3.2常用配置参数3.3测试并追踪元空间大小 四、总结 正文回到顶部一、背景1.1 永久代(PermGen)在哪里?根据,hotspot jvm结构如下...

2018-05-23 10:41:56 292

转载 垃圾回收算法——复制算法 以及eden和survivor

复制(Copying)算法说到底也是为了解决标记-清除算法产生的那些碎片。首先将内存分为大小相等的两部分(假设A、B两部分),每次呢只使用其中的一部分(这里我们假设为A区),等这部分用完了,这时候就将这里面还能活下来的对象复制到另一部分内存(这里设为B区)中,然后把A区中的剩下部分全部清理掉。这样一来每次清理都要对一半的内存进行回收操作,这样内存碎片的问题就解决了,可以说简单,高效。但是呢,肯定发...

2018-05-23 10:04:35 1424

转载 JAVA锁的分类大全

在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章来汇总下各种锁的分类。公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程...

2018-05-23 09:19:04 209

转载 谈谈mysql的事物隔离级别

一、事务先来看下百度百科对数据库事务的定义:作为单个逻辑单元执行一系列操作,要么完全执行,要么完全不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。事务有四个属性,称为ACID属性:1、原子性(Atomicity):事务是一个原子单位,要么全部执行,要么全部不执行。2、一致性(Consistent):事务的开始和结束,数据都必须保持一致状态。3、隔离性(...

2018-05-23 09:18:15 1262

转载 JVM原理讲解和调优

一、什么是JVM    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。    Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言...

2018-05-22 16:22:20 124

转载 五大常用算法详解

分治法基本思想将一个问题,分解为多个子问题,递归的去解决子问题,最终合并为问题的解适用情况问题分解为小问题后容易解决问题可以分解为小问题,即最优子结构分解后的小问题解可以合并为原问题的解小问题之间互相独立实例二分查找快速排序合并排序大整数乘法循环赛日程表动态划分算法基本思想将问题分解为多个子问题(阶段),按顺序求解,前一个问题的解为后一个问题提供信息适用情况最优化原理:问题的最优解所包含的子问题的...

2018-04-26 09:59:11 2120

原创 LeetCode第九题之回文数

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。进阶:你能不将整数转为字...

2018-04-25 11:26:08 449

原创 LeetCode第八题之字符串转整数 (atoi)

实现 atoi,将字符串转为整数。在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。当字符串中的第一个非空字符序列不是个...

2018-04-25 11:02:44 1118

原创 LeetCode第七题之反转整数

给定一个 32 位有符号整数,将整数中的数字进行反转。示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。思路一:用java自带的StringBuilder的reverse()...

2018-04-24 18:11:37 1139

原创 LeetCode第六题之Z字形变换

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:P A H NA P L S I I GY I R之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"实现一个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入: s = "PAYPALISHIRING", numRows ...

2018-04-24 10:44:32 2139

51CTO下载-社区视频监控系统VC++MFC源代码

SFDGH反复各回个话的复试地方法过后果后的发挥规范化付首付供货商

2011-03-18

院前心电图远程实时快速网络传输模式建立

fbndnfmvnbnxcvcgfdbgnbnbnxzxf

2011-03-18

51CTO下载-社区视频监控系统VC++MFC源代码

发个环境斤斤计较见见就发广告干哥哥古古怪怪古古怪怪

2011-03-18

空空如也

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

TA关注的人

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