【Java 原理性文章收录】教程文章相关的互联网学习教程文章

Java:HashMap实现原理。【图】

概述 HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是他不保证该顺序恒久不变。 数据结构 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。从上图中可以看出,HashMap底...

JAVA基础学习之-ThreadPoolExecutor的实现原理【代码】

池技术是性能优化的重要手段:连接池,线程池已经是开发中的标配了。面试中这个知识点也是高频问题。抽空学习了Java的ThreadPoolExecutor, 把学习的思路记录一下。 由于线程的创建和销毁都是系统层面的操作,涉及到系统资源的占用和回收,所以创建线程是一个重量级的操作。为了提升性能,就引入了线程池;即线程复用。Java不仅提供了线程池,还提供了线程池的操作工具类。 我们由浅入深了解一下。 import java.util.concurrent.Exe...

JAVA基础学习之-AQS的实现原理分析【代码】

AbstractQueuedSynchronizer是JUC的核心框架,其设计非常精妙。 使用了Java的模板方法模式。 首先试图还原一下其使用场景:对于排他锁,在同一时刻,N个线程只有1个线程能获取到锁;其他没有获取到锁的线程被挂起放置在队列中,待获取锁的线程释放锁后,再唤醒队列中的线程。 线程的挂起是获取锁失败时调用Unsafe.park()方法;线程的唤醒是由其他线程释放锁时调用Unsafe.unpark()实现。由于获取锁,执行锁内代码逻辑,释放锁整个流程...

JAVA框架学习笔记(3)基于RPC原理的dubbo【代码】【图】

原文地址:http://blog.jobbole.com/92290/ 在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示。这些程序的特点是服务消费方和服务提供方是本地调用关系。 而一旦踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题: 1)要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端...

Java的注解机制——Spring自动装配的实现原理【代码】

JDK1.5加入了对注解机制的支持,实际上我学习Java的时候就已经使用JDK1.6了,而且除了@Override和@SuppressWarnings(后者还是IDE给生成的……)之外没接触过其他的。进入公司前的面试,技术人员就问了我关于注解的问题,我就说可以生成chm手册……现在想起来真囧,注释和注解被我搞得完全一样了。使用注解主要是在需要使用Spring框架的时候,特别是使用SpringMVC。因为这时我们会发现它的强大之处:预处理。注解实际上相当于一种标记...

Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)【代码】【图】

概要 前面,我们已经学习了ArrayList。接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解。内容包括::1 fail-fast简介2 fail-fast示例3 fail-fast解决办法4?fail-fast原理5 解决fail-fast的原理 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308762.html 1 fail-fast简介 fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事...

深入理解Java中的底层阻塞原理及实现【代码】

谈到阻塞,相信大家都不会陌生了。阻塞的应用场景真的多得不要不要的,比如 生产-消费模式,限流统计等等。什么 ArrayBlockingQueue、 LinkedBlockingQueue、DelayQueue 等等,都是阻塞队列的实现啊,多简单! 阻塞,一般有两个特性很亮眼:1. 不耗 CPU 等待;2. 线程安全; 额,要这么说也 OK 的。毕竟,我们遇到的问题,到这里就够解决了。但是有没有想过,这容器的阻塞又是如何实现的呢? 好吧,翻开源码,也很简单了:(比如 A...

Java并发编程:Synchronized实现原理【图】

一、Synchronized的基本使用Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:(1)修饰普通方法(2)修饰静态方法(3)修饰代码块 二、Synchronized 原理1.Synchronized修饰代码块public class SynchronizedTest {public void m...

Java线程:概念与原理

一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 “同时...

Java集合系列之LinkedList底层实现原理【图】

Java中的LinkedList类实现了List接口和Deque接口,是一种链表类型的数据结构,支持高效的插入和删除操作,同时也实现了Deque接口,使得LinkedList类也具有队列的特性。LinkedList类的底层实现的数据结构是一个双端的链表。 LinkedList类中有一个内部私有类Node,这个类就代表双端链表的节点Node。这个类有三个属性,分别是前驱节点,本节点的值,后继结点。 源码中的实现是这样的。private static class Node<E> {E item;Node<E> n...

【java】ThreadLocal线程变量的实现原理和使用场景【代码】【图】

一.ThreadLocal线程变量的实现原理 1.ThreadLocal核心方法有这个几个 get()、set(value)、remove() 2.实现原理 ThreadLocal在每个线程都会创建一个线程内对应的T的副本,本T数据可以在本线程内任何地方可以被使用。线程之间互相不影响,所以是线程安全的。 3.底层结构 ThreadLocal实现各个线程数据副本的存取,是通过操作它的内部类ThreadLocalMap,进行<k,v>键值对的存取和移除。 4.set(value)方法的底层public void set(...

深度了解Java集合------------HashMap的实现原理

按照惯例,我们先简单介绍一下今天所说的集合实例:HashMap HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并且允许存储null形式的Key和Value。此实例不保证所映射的顺序,特别是不能保证该顺序一直不变。 二、那么接下来我们说一下HashMap的数据结构及底层原理 在Java编程语言中,最基本的结构就是两种,一种是数组,另外一种是模拟指针(引用);也可说成顺序存储和链式存储,几乎所有的数据结构都...

第2章 Java并发机制的底层实现原理【代码】【图】

2.2 synchronized的实现原理与应用当一个线程A执行字节码时遇到monitorenter指令时,会首先检查该指令关联的Object的对象头中的Mark Word状态。 2.2.1 如果是偏向锁如果2bit标志位为01代表此时处于偏向锁状态。如果2bit标志位为01且1bit的标志位为1,代表该对象此时处于偏向锁且锁被获取状态。如果Mark Word的线程ID是当前线程的ID,代表该线程之前已经获得了该偏向锁,那么可以继续执行同步代码块 如果当前Mark Word存的线程的ID不...

Java多线程和并发(八),synchronized底层原理【代码】【图】

目录 1.对象头(Mark Word) 2.对象自带的锁(Monitor) 3.自旋锁和自适应自旋锁 4.偏向锁 5.轻量级锁 6.偏向锁,轻量级锁,重量级锁联系 八、synchronized底层原理 1.对象头(Mark Word) 2.对象自带的锁(Monitor)(1)javap反编译查看原理同步代码块public class SyncBlockAndMethod {public void syncsTask() {synchronized (this) {System.out.println("Hello");}} } (2)重入 (3)同步方法public synchronized void ...

JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?【代码】【图】

起因 public static void main(String[] args) {ExecutorService service = Executors.newFixedThreadPool(10);service.submit(() -> System.out.println("Hello "));System.out.println("World");}呵呵,执行结果谁都知道,显而易见结论线程池的创建的时候,第一次submit操作会创建Worker线程(负责去拿任务处理),该线程里写了一个死循环,所以这个Worker线程不会死Worker线程在创建的时候,被设置成了非守护线程,thread.setDa...