Java

Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等,是目前企业级应用的主力编程语言。

最新博文

  • 【顶】 一文让你理解as-if-serila和happens-before语义

    Java多线程与高并发 一文让你理解as-if-serila和happens-before语义

    概述本文参考《Java并发编程的艺术》一书,温故而知新,加深对基础的理解。一、指令序列的重排序我们在编写代码的时候,通常自上而下编写,那么希望执行的顺序,理论上也是逐步串行执行,但是为了提高性能,编译器和处理器常常会对指令做重排序。从Java源码到最终实际的指令,需要经过三个阶段的重排序:1)...

    2020-06-07 44

    阅读全文
  • 【顶】 秒懂,Java 注解 (Annotation)看这一篇就够了

    Java基础 秒懂,Java 注解 (Annotation)看这一篇就够了

    Annotation中文译过来就是注解、标释的意思,在Java中注解是一个很重要的知识点,但经常还是有点让新手不容易理解。我们经常可以看到一些文章对注解的解释如下:Java注解用于为Java代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Ja...

    2020-06-07 32

    阅读全文
  • 【顶】 JAVA集合总结,将知识点一网打尽!

    Java集合与容器 JAVA集合总结,将知识点一网打尽!

    一、Java集合框架体系总览总的来说,Java集合框架以Collection接口为中心,下属是三个子接口,分别是:List(线性表)、Set、Queue(队列),以及还有一个非常重要的Map接口。下面我们分别总结一下每种类型集合下的知识点。Collection接口首先我们来看一下Collect...

    2020-04-22 49

    阅读全文
  • 高并发编程之JAVA中的阻塞队列

    Java集合与容器 高并发编程之JAVA中的阻塞队列

    队列是一种访问受限的线性数据结构,它有两个基本操作:在队列尾部加入元素和从队列头部移除元素。在我们日常开发中,经常用来并发操作数据。java中提供了一些应用比较广泛的特殊队列:一种是以ConcurrentLinkedQueue为代表的非阻塞队列;另一种是以BlockingQueue接口为代表的...

    2020-04-21 53

    阅读全文
  • 高并发编程之CopyOnWriteArrayList—源码剖析

    Java集合与容器 高并发编程之CopyOnWriteArrayList—源码剖析

    CopyOnWriteArrayList是J.U.C包下的一个并发容器,它是线程安全且读操作无锁的ArrayList,写操作(增删改)则通过将底层数组拷贝一份,更改操作全部在新数组上进行,是一种读写分离的并发策略,我们也可以称这种容器为"写时复制器",Java并发包中类似的...

    2020-04-20 77

    阅读全文
  • 高并发编程之ConcurrentLinkedQueue和ConcurrentLinkedDeque—源码剖析

    Java集合与容器 高并发编程之ConcurrentLinkedQueue和ConcurrentLinkedDeque—源码剖析

    一、ConcurrentLinkedQueue简介在Java开发个过程中我们不可避免的会使用到一些集合类,比如ArrayList、HashMap等,这些集合类型在多线程环境下使用会有线程安全问题。虽然不同的集合类型都有他的线程安全版本,比如ArrayList不是线程安全的,Vector是线程安...

    2020-04-19 56

    阅读全文
  • 高并发编程之CnocurrentHashMap—源码剖析

    Java集合与容器 高并发编程之CnocurrentHashMap—源码剖析

    HashMap在多线程环境下有线程安全问题,因此在多线程环境下不要直接使用HashMap,而是使用下面几种不同的方式去代替:(1)使用ConcurrentHashMap(2)使用Hashtable(3)使用Collections.synchronizedMap(Mapmap)方法将HashMa...

    2020-04-19 49

    阅读全文
  • HashMap是如何工作的

    Java集合与容器 HashMap是如何工作的

    声明:基于jdk1.8源码。一、认识HashMapHashMap最早在jdk1.2就出现了,直到jdk1.7都没有太大的改动:jdk1.7的采用的存储结构是采用了数组+链表,jdk1.8的存储结构数组+链表+红黑树HashMap允许存储一个键和值都为null的元素(这一点Hashtable不可...

    2020-04-15 97

    阅读全文
  • 面试常问的几个Java并发工具类你都GET到了吗?

    Java多线程与高并发 面试常问的几个Java并发工具类你都GET到了吗?

    在JDK的并发中提供了几个非常有用的并发工具类:CountDwonLatch、CyclicBarrier、Semaphore。下面我们就一起了解一下这些类的基本使用以及基本原理吧。PS:最起码你得知道它们是干什么用得,下面列出得代码也建议你跑跑。其实如果你理解AQS的设计原理的话,这些工具类的...

    2020-04-13 61

    阅读全文
  • 高并发编程之ReentrantLock—源码剖析

    Java多线程与高并发 高并发编程之ReentrantLock—源码剖析

    一、从Lock接口说起锁时用来控制多个线程范文共享资源,保证资源安全性的一种重要手段。在Lock接口出现以前,Java陈旭是靠synchorinzed关键字实现锁功能点的,在jdk1.5之前使用synchroinzed绝对是一个重量级的操作,因为synchroinzed是依赖对象锁实现的,而对...

    2020-04-12 59

    阅读全文
  • 高并发编程之AQS(AbstractQueuedSynchornizer)—源码剖析

    Java多线程与高并发 高并发编程之AQS(AbstractQueuedSynchornizer)—源码剖析

    AQS概述AQS是AbstractQueuedSynchorinizer的简写,中文名是队列同步器。AQS是Java实现阻塞式锁和同步工具的基石。它使用一个int类型的成员变量表示同步状态,通过内置的一个FIFO队列完成资源获取线程的排队工作。AQS是一个抽象类,主要是通过继承的方式来使用,它...

    2020-04-11 131

    阅读全文
  • 高并发编程之线程池ThreadPoolExecutor详解

    Java多线程与高并发 高并发编程之线程池ThreadPoolExecutor详解

    如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。今天我...

    2020-04-09 82

    阅读全文
  • 深入理解Java魔法类Unsafe

    Java多线程与高并发 深入理解Java魔法类Unsafe

    前言​Unsafe为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用。其实例一般情况是获取不到的,源码中的设计是采用单例模式,不是启动类加载器加载初始化就会抛SecurityException异常。​这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提...

    2020-04-06 55

    阅读全文
  • 高并发编程之高性能原子类LongAdder—源码剖析

    Java多线程与高并发 高并发编程之高性能原子类LongAdder—源码剖析

    高性能原子类是java8中增加的原子类,它们使用分段的思想(Cell[]),把不同的线程hash到不同的段上去更新,最后再把这些段的值相加得到最终的值,相对Atomic类这些类运行性能更高,这些类主要有:(1)Striped64:下面四个类的父类。(2)LongAccumulator:long...

    2020-04-06 62

    阅读全文
  • 高并发编程之原子类AtomicStampedReference—源码剖析

    Java多线程与高并发 高并发编程之原子类AtomicStampedReference—源码剖析

    AtomicStampedReference是Java提出的一个原子类,它可以解决ABA问题。与这个类有同样作用的类是AtomicMarkableReference,他们都可以解决CAS的ABA问题。一、什么是ABA问题?ABA的危害?ABA问题发生在多线程环境下,说的是当线程A对一个变量使用...

    2020-04-06 77

    阅读全文
  • 高并发编程之原子类AtomicInteger—源码剖析

    Java多线程与高并发 高并发编程之原子类AtomicInteger—源码剖析

    AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的数值,通过调用底层Unsafe的CAS等方法实现原子操作。源码分析一、主要属性(1)unsafe:Unsafe类的实例(2)value:使用int类型的value存储值,且使用volatile修饰,volati...

    2020-04-06 67

    阅读全文
  • 深入理解CAS无锁机制

    Java多线程与高并发 深入理解CAS无锁机制

    一、什么是CAS?CAS(CompareAndSweap或者CompareAndSet,比较替换),CAS和volatile的读写共同支撑起了整合JUC包。工作原理是:一个CAS操作有三个操作数,目标内存地址V,旧的预期值E和将要替换的新值B,在进行替换操作前比较当且仅当目标内存地址V中的值和...

    2020-04-06 69

    阅读全文
  • 都2020年了你还不理解volatile关键字?

    Java多线程与高并发 都2020年了你还不理解volatile关键字?

    先给出结论:volatile可以保证不同线程对一个变量的可见性,即一个线程修改了被voaltile修饰的变量后,这新值对其他线程来说是立即可见的;volatile可以禁止指令重排序,保证了有序性;volatile不能保证原子性,更加不能保证线程安全,要想保证原子性和线程安全还是乖乖的使用锁吧!...

    2020-04-04 77

    阅读全文
  • 高并发编程之LockSupport深入源码剖析

    Java多线程与高并发 高并发编程之LockSupport深入源码剖析

    与Object的wait()/notify()相比:wait()、notify()、notifyAll()都必须配置Objectmonitor使用,而LockSupport的park()、unpark()方法不必park()、unpark()可以精确到一个线程来阻塞和唤醒它,但是notify(...

    2020-04-03 74

    阅读全文
  • 高并发编程之等待/通知机制

    Java多线程与高并发 高并发编程之等待/通知机制

    一、什么是等待/通知机制?多个线程之间也可以实现通信,原因就是多个线程共同刚访问同一个变量。但是这种通信机制不是“等待/通知”,两个线程完全是主动地读取一个共享变量。简单的说,等待/通知机制就是一个【线程A】等待,一个【线程B】通知(线程A可以不用再等待了)。比如生产者和消费者模型,消费者等待...

    2020-04-03 94

    阅读全文
  • 作为Java工程师你真的理解synchronized吗

    Java多线程与高并发 作为Java工程师你真的理解synchronized吗

    造成线程安全问题的诱因主要有两点:存在共享数据(临界区资源)存在多个线程对临界区资源的读写操作因此,为了保证临界区数据的安全,引入了互斥锁的概念,即一个共享数据同时只能被一个线程访问,其他线程需要等待(阻塞),直至当前线程处理完毕释放该锁。synchronized就保证了同一时刻只有一个线程对...

    2020-04-02 115

    阅读全文
  • Java中终止线程的4种方式

    Java多线程与高并发 Java中终止线程的4种方式

    在Java中一个线程终止有以下几种情况和方法1、线程执行完任务正常结束2、使用退出标志退出线程(推荐)一般run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如:最直接的方法就是...

    2020-04-01 66

    阅读全文
  • Thread和Runnable深入源码剖析

    Java多线程与高并发 Thread和Runnable深入源码剖析

    一、Runnable的实现类Thread类本质是Runnable的一个实现类,Runnable从jdk1.0就有了,并且在jdk1.8开始成为了一个函数式接口,这使得我么可以使用lambda简化线程的创建。二、Thread类的构造方法所有构造方法都是调用init()方法来完成对一个线程的初始化...

    2020-03-31 104

    阅读全文
  • 对ThreadLocal的理解?ThreadLocal如何解决内存泄漏问题?

    Java多线程与高并发 对ThreadLocal的理解?ThreadLocal如何解决内存泄漏问题?

    一、ThreadLocal是什么?ThreadLocal是一个本地线程副本变量工具类。ThreadLocal中填充的变量只属于当前线程,与其他线程无关。ThreadLocal为变量在每个线程中都创建了一个副本,每个线程可以访问自己内部的副本变量。二、ThreadLocal深入源码剖析Threa...

    2020-03-30 112

    阅读全文
  • Java多线程和高并发总结(基础)

    Java多线程与高并发 Java多线程和高并发总结(基础)

    一、进程的概念?进程可以理解为一个应用程序执行的实例(比如在windows下打开Word就启动了一个进程),进程是资源分配的最小单位,每个进程都有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段。进程主要有数据、程序和程序控制块(PCB)组成...

    2020-03-29 115

    阅读全文
  • 深入理解JVM—垃圾回收器(Grabage Collector)进阶篇

    JVM 深入理解JVM—垃圾回收器(Grabage Collector)进阶篇

           在上一篇博客我们了解了Java判定对象不可用的两种算法,以及3种垃圾回收算法。如果说收集算法室内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。接下来我们就一起来了解一下不同实现的垃圾收集器。1、垃圾收集器1.1串行垃圾收集器(1)Serial收集器       Seria...

    2020-02-18 98

    阅读全文
  • 深入理解JVM—垃圾回收器(Grabage Collector)基础篇

    JVM 深入理解JVM—垃圾回收器(Grabage Collector)基础篇

    1、如何判断对象可以被回收1.1引用计数法       给对象添加一个引用计数器,每当有一个地方引用该对象的时候此计数器+1;当一个引用失效后计数器-1,当计数器的值减为0了的对象就不在可能被使用了。优点:实现简单,判定效率高。缺点:当对象之间的相互循环引用时,会导致GC失效,从而造成内存泄漏...

    2020-02-17 98

    阅读全文
  • 深入理解JVM—堆(Heap)

    JVM 深入理解JVM—堆(Heap)

    1、堆(Heap)概述       Java堆(JavaHeap)是JVM所管理的最大的一块内存空间。Java堆是被所有线程共享的一块内存区域,在JVM启动的时候创建。堆的唯一目的就是存放对象实例的,Java中几乎所有的对象实例和数组都在对上分配内存。Java堆的容量可以是固定大小的,也可以随...

    2020-02-16 55

    阅读全文
  • 深入理解JVM— Java对象的创建过程、对象内存布局、对象的引用方式详解

    JVM 深入理解JVM— Java对象的创建过程、对象内存布局、对象的引用方式详解

    一、对象的创建过程(1)判断类是否加载。检查常量池中是否可以定位到指定类的符号引用,并且检查这个符号引用所代表的类时候已经被加载、链接和初始化过。如果可以定位到符号引用,并且已经被加载过:进入第2步如果没法定位到符号引用或没有被加载过:执行相应的类加载过程。(2)分配内存。(指针碰撞:Seri...

    2020-02-15 55

    阅读全文
  • 深入理解JVM—字符串常量池StringTable

    JVM 深入理解JVM—字符串常量池StringTable

           首先我们来看一道关于字符串的面试题,请大家先不要直接上机运行,自己先在脑子里运行一下这段程序,如果你可以很清晰的得到所有输出,那么恭喜你!这篇文章你就不要在浪费时间再看了;如果你在某一步还有不清楚的,那么这篇文章将会一网打尽所有你对String常量池的疑虑。运行结果:1、Stri...

    2020-02-14 45

    阅读全文
  • 深入理解JVM—方法区

    JVM 深入理解JVM—方法区

    1、方法区概述       方法区(MethodArea)和Java堆内存一样是线程共享的一块内存区域,它被主要用来存储已经被虚拟机加载的类信息(字段、方法、构造器的字节码)、常量、静态变量、JIT编译后的代码等等(说的再简单直白点就是用来存储每个已经记载的类的结构信息)。       然而方...

    2020-02-13 44

    阅读全文
  • 深入理解JVM—Java虚拟机桟

    JVM 深入理解JVM—Java虚拟机桟

    1、虚拟机桟概述由于跨平台性的设计,JVM的指令架构是基于桟的结构来设计的,这么做的优点:一是具有了跨平台性,其次使得指令集更小,编译器更容易实现,但缺点也很明显:实现同样的功能需要更多的指令和性能下降。栈是运行时的单位,堆是存储的单位栈解决的程序运行问题,即程序如何执行,或者说如何处理数据;...

    2020-02-12 44

    阅读全文
  • 深入理解JVM—程序计数器

    JVM 深入理解JVM—程序计数器

    1、JVM内存模型概述Java虚拟机(JVM)在Java程序运行的过程中,会将它所管理的内存划分为若干个不同的数据区域,这些区域有的随着JVM的启动而创建,有的随着用户线程的启动和结束而建立和销毁。一个基本的JVM运行时内存模型如下所示:图1JVM运行时数据区上图是展示JDK8及以后的虚拟机规...

    2020-02-11 38

    阅读全文
  • 深入理解JVM—虚拟机类加载机制

    JVM 深入理解JVM—虚拟机类加载机制

    1、JVM内存结构概述JVM是Java技术的核心,因为任何Java程序最终都需要运行在JVM上。构成JVM的主要三分部分有:类加载子系统、运行时数据区和执行引擎。他们各自发挥着各自的本领,构建起强大的JVM。JVM的具体组成如下图所示:图1JVM整体结构示意(详)图看完这个图,我想大家对于JV...

    2020-02-10 42

    阅读全文
  • 深入理解JVM—走进Java虚拟机

    JVM 深入理解JVM—走进Java虚拟机

    1、JDK,JRE,JVM之间的关系仅从传统意义上来看,Sun定义的Java技术体系包括:Java程序设计语言、各种平台上的JVM、Class文件格式、JavaAPI类库、来自商业机构和开源社区的第三方Java类库。-JDK全程为JavaSEDevelopmentKit(Java开发工具),是...

    2020-02-10 60

    阅读全文