Java Volatile关键字

原文地址 作者:Jakob Jenkov 译者:小龙虾

Java的volatile关键字用于标记一个变量“应当存储在主存”。更确切地说,每次读取volatile变量,都应该从主存读取,而不是从CPU缓存读取。每次写入一个volatile变量,应该写到主存中,而不是仅仅写到CPU缓存。

实际上,从Java 5开始,volatile关键字除了保证volatile变量从主存读写外,还提供了更多的保障。我将在后面的章节中进行说明。

阅读全文

走进Java

 作者:小村长

本项目是 周志明 老师写的《深入理解Java虚拟机》的读书笔记,也是我迄今为止读到的认为介绍JVM最好的一本书籍, 读了很多遍,每次都对JVM有新认识。本次笔记主要针对想了解JVM的同学,希望能够对大家的工作和学习有所帮助。

由于我也是第一次公开自己的读书笔记,还不是很深入,可能某些地方存在不足。希望大家有什么好的建议可以评价告诉我,我看到会尽力改进,力争能给大家提供优质的读书笔记。同时也希望有能力的同学也共享自己读书笔记方便大家交流学习。在此,我还是建议有时间的同学能够自己去看看周老师书籍。

概述

Java不仅仅是一门编程语言,还是一个由一些列计算机软件和规范形成的技术体系

Java技术体系

Sun定义的Java技术体系包括: – [x] Java程序设计语言 – [x] Java虚拟机 – [x] Class文件格式 – [x] Java API类库 – [x] Java类库

Java程序设计语言、Java虚拟机、Java API类库统称为JDK,JDK是用于Java程序开发的最小环境 <br/> Java API类库中的Java SE API子集和Java虚拟机统称为JRE,JRE是支持Java程序运行的标准环境

Java技术体系可分为四个平台: – Java Card:是一个让Java小程序(Applets)运行在小内存设备(智能卡等)的平台 – Java ME:这个平台支持的是在移动终端(手机平板等)运行Java程序 – Java SE:是一个支持桌面级应用程序(例如windows中的应用程序)的平台,提供了完整的Java核心API – Java EE: 是一个支持多层架构企业应用(例如企业资源计划的平台

展望Java技术的未来
  • 模块化
  • 混合语言
  • 多核并行
  • 进一步丰富语法
  • 64位虚拟机

Dubbo中参数回调 Callback 实现深究

参数回调 Callback是Dubbo中一种机制,与调用本地callback相同,将基于长连接生成反向代理在服务端执行客户端的逻辑,本文将以以下内容展开。

阅读全文

一个线程罢工的诡异事件

原文地址:https://crossoverjie.top/2019/03/12/troubleshoot/thread-gone/


背景

事情(事故)是这样的,突然收到报警,线上某个应用里业务逻辑没有执行,导致的结果是数据库里的某些数据没有更新。虽然是前人写的代码,但作为 Bug maker&killer 只能咬着牙上了。因为之前没有接触过出问题这块的逻辑,所以简单理了下如图:

阅读全文

Java并发之AQS详解

一、概述

  谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!

  类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch…。

  以下是本文的目录大纲:

  1. 概述
  2. 框架
  3. 源码详解
  4. 简单应用
阅读全文

线程安全的可控制最大容量且带有过期时间的本地缓存

最近在公司优化一个接口的时候打算使用一个key-value结构的本地缓存。
需要实现的功能非常简单:
1、可以控制本地缓存的最大对象数量。
2、线程安全,防止发生OOM。
3、同时支持设置单个对象的过期时间。

阅读全文

透过CountDownLatch窥探AQS

本文来自公众号“Kahuna”,可搜索Alitaba119,欢迎关注,转载请注明出处,非常感谢


 A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

这是CountDownLatch这个类要解决的问题:实现一个同步器,让一个或者多个线程一直等待,直到一组在其他线程中执行的操作完成。

阅读全文

下一代的多语言JVM:GraalVM

GraalVM是一款高性能的可嵌入式多语言虚拟机,它能运行不同的编程语言,包括:

  • 基于JVM的语言,比如Java, Scala, Kotlin和Groovy
  • 解释型语言,比如JavaScript, Ruby, R和Python
  • LLVM支持的原生语言,比如C, C++, Rust和Swift
阅读全文

手撕面试题ThreadLocal!!!

摘要: 原创出处 http://www.jiangxinlingdu.com/ 「公众号:匠心零度 」欢迎关注和转载,保留摘要,谢谢!

说明

面试官:讲讲你对ThreadLocal的一些理解。

那么我们该怎么回答呢????你也可以思考下,下面看看零度的思考;

  • ThreadLocal用在什么地方?
  • ThreadLocal一些细节!
  • ThreadLocal的最佳实践!
  • 思考
阅读全文

Java 10的类型推导

Java 10带来了全新的语言特性:局部变量类型推导(local variable type inference)。它的主要目标就是减少样板代码(boilerplate),增强代码可读性。可以使用关键词var来替代局部变量的类型声明——编译器会根据变量初始化语句来自己填充正确的类型的。比如说:

Map<User, List<String>> userChannels = new HashMap<>();

阅读全文

谈谈Netty的线程模型

一、前言

Netty是一个异步、基于事件驱动的网络应用程序框架,其对 Java NIO进行了封装,大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它的设计参考了许多协议的实现,比如 FTP,SMTP,HTTP 和各种二进制和基于文本的传统协议,因此 Netty 成功的实现了兼顾快速开发,性能,稳定性,灵活性为一体,不需要为了考虑一方面原因而妥协其他方面。Netty 的应用还是比较广泛的,比如Apache Dubbo 、Apache RocketMq、Zuul 2.0服务网关、Spring WebFlux、Sofa-Bolt 底层网络通讯都是基于 Netty 来实现的,本文探讨Netty4。

阅读全文

JVM之动态方法调用:invokedynamic

在本文的前面的姊妹篇中,介绍了Java方法调用的5种操作码中的4种。它们是Java 8和Java 9中方法调用的标准字节码形式。

于是第五个操作码invokedynamic便进入了我们的视线。简单来说,Java 7中在语言层面上对invokedynamic是没有直接支持的。事实上,当Java 7的运行时首次引入invokedynamic指令时,javac编译器是不会生成这个字节码的。

阅读全文

Java 异步编程导论

异步编程是可以让程序并行运行的一种手段,其可以让程序中的一个工作单元与主应用程序线程分开独立运行,并且等工作单元运行结束后通知主应用程序线程它的运行结果或者失败原因。使用它有许多好处,例如改进的应用程序性能和减少用户等待时间等。

阅读全文

JVM优化之循环展开

在JVM内部实现系列的前几篇文章中,我们已经看到了Java的HotSpot虚拟机的just-in-time (JIT)编译技术,包括逃逸分析和锁消除。本文我们将要讨论另一种自动优化,叫作循环展开。JIT编译器使用这项技术来让循环(比如Java的for或者while循环)执行得更加高效。

阅读全文

看完这篇还不清楚Netty的内存管理,那我就哭了!

摘要: 原创出处 http://www.jiangxinlingdu.com/ 「公众号:匠心零度 」欢迎关注和转载,保留摘要,谢谢!

说明

在学习Netty的时候,ByteBuf随处可见,但是如何高效分配ByteBuf还是很复杂的,Netty的池化内存分配这块还是比较难的,很多人学习过,看过但是还是云里雾里的,本篇文章就是主要来讲解:Netty分配池化的堆外内存的细节,期待可以让你明白!!!

由于为了更好的表达,文章中的图我最少画了6小时,画的不熟悉,并且也强调一些细节上。

由于该源码中涉及到大量的二进制操作,建议看看我之前写的2篇二进制文章:java二进制相关基础二进制实战技巧

阅读全文

return top