![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
文章平均质量分 82
Java 编程语言特性,io, jvm, collection, stream, etc
1. Java 源码剖析 34 讲
2. 32个Java面试必考点
3. Java 并发编程 78 讲
AhahaGe
学会学习,持续学习
展开
-
Java 应用程序时区问题
前端页面发现日期数据异常排查:1. 由于这个问题是开发另外一个功能的时候发现的,所以怀疑是环境原因 2. 看了下服务器的时间,date命令发现时间是对的 3. 但是查看日志文件,时间错误,比服务器时间晚 8 个小时 4. jinfo pid查看应用配置信息发现 user.timezone = UTC,然后根据这个配置去ctzs-time-zone-ids-that-can-be-specified-usertimezone-property 发现 UTC UCT 0 : 00 Coordinated.原创 2022-03-24 11:01:13 · 1165 阅读 · 0 评论 -
Java并发编程实战读书笔记——第三章:对象的共享
第三章:对象的共享如何共享和发布对象,从而使它们能够安全地由多个线程同时访问。3.1 可见性在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些问题想不到的调整。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,几乎无法得出正确的结论。3.1.1失效数据在缺少同步的情况下,JAVA内存模型允许编译对操作顺序进行重排序,并将数值缓存在...原创 2018-06-28 23:21:35 · 279 阅读 · 0 评论 -
Java并发编程实战读书笔记——第十二章 并发程序的测试
测试并发程序的挑战主要是:潜在的错误的发生并不具有确定性,而是随机的。并发测试大致分为两类:安全测测试与活跃性测试。安全性定义为不发和任何错误的行为,活跃性定义为某个良好的行为终究会发生。性能测试:吞吐量指一组并发任务中已完成任务所占的比例;响应性:指请求从发出到完成之间的时间(延迟);可伸缩性:指在增加更多资源的情况下(CPU),吞吐量的提升情况。12.1 正确性测试找出需要...原创 2018-08-16 15:42:18 · 234 阅读 · 0 评论 -
5. 竞态条件与临界区
在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的。多线程同时执行下面的代码可能会出错:查看源代码打印帮助1 public class Counter {2 protected long count = 0;3 public void add(lo原创 2020-11-24 14:16:13 · 132 阅读 · 0 评论 -
14. Starvation and Fairness
Table of Contents1. Causes of Starvation in Java1.1 Threads with high priority swallow all CPU time from threads with lower priority1.2 Threads are blocked indefinitely waiting to enter a synchronized block1.3 Threads waiting on an object (called wait() on原创 2020-11-25 10:27:14 · 130 阅读 · 0 评论 -
Java并发编程实战读书笔记——第六章 任务执行
任务通过是一些抽象的且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事务边界来优化错误恢复过程,以及提供一种自然的并行工作结构来提升并发性。6.1 在线程中执行任务第一步就是要找出清晰的任务边界。独立性有助于实现并发,因为如果存在足够多的处理资源,那么这些独立的任务都可以并行执行。服务器应用程序应该同时表现出良好的吞吐量和快速的响应性。...原创 2018-08-12 09:34:03 · 239 阅读 · 0 评论 -
JAVA虚拟机并发编程读书笔记——第一部分 并发策略 第3章 设计方法
设计方法操纵状态并不一定意味着改变状态。考虑用状态转换来代替修改状态,这是一种无需修改任何东西就能改变状态的设计方法。在本意中,我们将会研究无需更改内存中任何数据的程序设计方法。本意函盖了很多设计的基础方法。处理状态:1.共享可变性 share mutability2.隔离可变性 isolated mutability3.纯粹不可变性 pure inmutability在一个JAVA用...原创 2019-06-21 11:40:59 · 97 阅读 · 0 评论 -
10. Java ThreadLocal
Tables of content1. Creating a ThreadLocal2. Accessing a ThreadLocal3. Generic ThreadLocal:泛型4. Initial ThreadLocal Value5. Full ThreadLocal Example6. InheritableThreadLocal7. set源代码解析8. Get the map associated with a ThreadLocal.9. Create the map associate原创 2020-11-25 10:00:57 · 63 阅读 · 0 评论 -
Java并发编程实战读书笔记——第八章 线程池的使用
8.1 在任务与执行策略之间的隐性耦合有些类型的任务需要明确地指定执行策略,包括:1.依赖性任务:避免产生活跃性问题2.使用线程封闭机制的任务:任务要求其执行所在的Executor是单线程的。3.对响应时间敏感的任务4.使用ThreadLocal的任务线程池的线程中不应该使用ThreadLocal在任务之间传递值。只有当线程本地值的生命周期受限于任务的生命周...原创 2018-08-12 09:42:50 · 282 阅读 · 0 评论 -
9. Java‘s Volatile Keyword
Java's Volatile KeywordJava volatile Guarantees Variable VisibilityThe Java volatile GuaranteeWhen is volatile Enough?Performance Considerations of volatileThe Java volatile keyword is used to mark a Java variable as “being stored in main memory”. More pr原创 2020-11-25 09:42:34 · 105 阅读 · 0 评论 -
3. 多线程的代价
从一个单线程的应用到一个多线程的应用并不仅仅带来好处,它也会有一些代价。不要仅仅为了使用多线程而使用多线程。而应该明确在使用多线程时能多来的好处比所付出的代价大的时候,才使用多线程。如果存在疑问,应该尝试测量一下应用程序的性能和响应能力,而不只是猜测。设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂。在多线程访问共享数据的时候,这部分代码需要特别的注意。线程之间的交互往往非常复杂。不正确的线程同步产生的错误非常难以被发现,并且重现以修复。上下文切换的开销当CPU从执行原创 2020-11-24 14:08:48 · 84 阅读 · 0 评论 -
JAVA中的HashMap是如何工作的
译自how-does-a-hashmap-work-in-java 大部分JAVA开发人员使用Maps,尤其是HashMaps。哈希映射是一个简单但是强大的存储和获取数据的方式。但是有多少开发人员知道HashMap内部是如何工作的吗?几年以前,我读了大量的java.util.HashMap源代码 (先是JAVA7后是JAVA8),为了对这个基本的数据结构有深入的了解。在这篇帖子中,我会介绍jav...翻译 2018-05-20 12:57:43 · 3220 阅读 · 2 评论 -
Java并发编程实战读书笔记——第十一章 性能与可伸缩性
第11章 性能与可伸缩性线程的最主要目的是提高程序的运行性能。线程可以使线程更加充分地发挥系统的可用处理能力,从而提高系统的资源利用率。此外,线程还可以使程序在运行现有任务的情况下立即开始处理新的任务,从而提高系统的响应性。本章将介绍各种分析、监测以及提升并发程序性能的技术。然而,它们同样会增加复杂性,因此也就增加了在安全性和活跃性上发生失败的风险。更糟糕的是,它们也可能带来其他的新的性能...原创 2018-08-13 20:39:56 · 379 阅读 · 0 评论 -
7. 线程安全及不可变性
**当多个线程同时访问同一个资源,并且其中的一个或者多个线程对这个资源进行了写操作,才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改,从而实现线程安全。**如下示例:查看源代码打印帮助01 public class ImmutableValue{02 private int value = 0;03 04 public ImmutableValue(int value){05 this原创 2020-11-24 14:23:16 · 143 阅读 · 0 评论 -
1. Java并发性和多线程介绍
在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间、所有的内存和其他计算机资源。一个好的程序榜样是在其不再使用这些资源时对其进行释放,以使得其他程序能有机会使用这些资源。再后来发展到多线程技术,使得在一原创 2020-11-24 14:03:40 · 131 阅读 · 0 评论 -
12. Deadlock
Table of Contents1. Thread Deadlock2. More Complicated Deadlocks3. Database Deadlocks1. Thread DeadlockA deadlock is when two or more threads are blocked waiting to obtain locks that some of the other threads in the deadlock are holding. Deadlock can occ原创 2020-11-25 10:15:24 · 157 阅读 · 0 评论 -
Java并发编程实战读书笔记——第四章 对象的组合
第4章 对象的组合将一些现有的线程安全组件组合为更大规模的组件或程序。4.1 设计线程安全的类在设计线程安全类的过程中,需要包含以下三个基本要素:找出构成对象状态的所有变量找出约束状态变量的不变性条件建立对象状态的并发访问管理策略4.1.1 收集同步需求状态空间越小,就容易判断线程的状态。final类型的域使用得越多,就越能简化对象可能状态的分析过程。如...原创 2018-06-28 23:23:54 · 569 阅读 · 0 评论 -
4. 如何创建并运行java线程
Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:1 Tread thread = new Thread();执行该线程可以调用该线程的start()方法:1 thread.start();在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了。**编写线程运行时执行的代码有两种方式:一种是创建Thread子类的一个实例并重写run方法,第二种是创建类的时候实现Runnable接口。**原创 2020-11-24 14:12:42 · 85 阅读 · 0 评论 -
Java并发编程实战读书笔记——第一章 简介
第一章 简介1.1 并发简史计算机中加入操作系统来实现多个程序同时执行:a. 资源利用率,IO b. 公平性,时间分片共享计算机资源 c. 便利性串行性和异步性线程是基本的调度单位。线程会共享进程的内存句柄和文件句柄。多路I/O,Unix的select和poll等系统调用,Java类库需要获得一组实现非阻塞I/O的包(java.nio)。1.NPTL支持数十万个线程...原创 2018-06-28 23:17:38 · 341 阅读 · 0 评论 -
JAVA虚拟机并发编程读书笔记——第一部分 并发策略 第2章 分工原则
从顺序到并发目标:学习如何估计要创建多少个线程、如何分解问题以及如何估算性能提升的程序确定线程数:当有多个任务处于就绪状态时,处理器核心需要在线程间频繁进行上下文切换,而这种切换对程序性能影响很大。当一个任务执行IO操作时,其线程将会被阻塞,于是处理器进行上下文切换以便处理其他就绪线程。如果我们只有处理器可用核心数那么多个线程的话,则即使有待执行的任务也无法处理,因为我们已经没有更多的线程...原创 2019-06-21 11:40:24 · 95 阅读 · 0 评论 -
JAVA虚拟机并发编程读书笔记——第一部分 并发策略 第1章 并发的威力与风险
线程:程序的执行流程并发程序是指使用了多线程或多个并发执行流程的应用程序。单核处理器:并发任务通常指多工或多任务执行方式。也就是说,该单核处理器将会不断地在多个执行流程中进行上下文切换,但任意时刻有且只有一个线程能够被执行。而一个多核处理器,在任意时刻可以有多个执行流程被执行,可并发执行的线程数取决于处理器的可用内核数,而应用程序的并发线程数则取决于与该进程相关联的处理器内存数。并发的威力...原创 2019-06-21 11:32:53 · 161 阅读 · 0 评论 -
Java并发编程实战读书笔记——第十章 避免活跃性危险
在安全性与活跃性之间通常存在着某种制衡。我们使用加锁来确保线程安全,但如果过度加锁,则可能导致锁顺序死锁(Lock-Ordering Deadlock)。同样,我们使用线程池和信号量来限制对资源的使用,但这些限制的行为可能会导致资源死锁(ResourceDeadLock)。Java应用程序无法从死锁中恢复,因此要避免。10.1 死锁经典的哲学家进餐问题很好地描述了死锁状况。*5个哲学家...原创 2018-08-12 23:17:13 · 403 阅读 · 0 评论 -
Java并发编程实战读书笔记——第五章 基础构建模块
阻塞队列、信号量(Semaphore)、栅栏(Barrier)以及闭锁(Latch)所有的同步工具类都包含一些特定的结构化属性:它们封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待,此外还提供了一些方法对状态进行操作,以及另一些方法高效地等待同步工具类进入到预期状态。5.5.1 闭锁闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用相当于...原创 2018-08-12 09:29:02 · 325 阅读 · 0 评论 -
2. 多线程的优点
尽管面临很多挑战,多线程有一些优点使得它一直被使用。这些优点是:资源利用率更好:主要是更充分利用cpu资源程序设计在某些情况下更简单程序响应更快:以服务器应用为例资源利用率更好想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要:1 5秒读取文件A2 2秒处理文件A3 5秒读取文件B4 2秒处理文件B5 ---------------------6 总共需要14秒从磁盘中读取文件的时候,大部分原创 2020-11-24 14:06:46 · 148 阅读 · 0 评论 -
Java并发编程实战读书笔记——第十三章 显式锁
Synchronized,volatile,ReentrantLockReentrantLock不是一种替代内置加锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能。13.1 Lock与ReentrantLockLock接口提供了一种无条件、可轮询的、定时的以及可中断的显示锁获取操作。ReentrantLock实现了Lock接口,并提供了与synchronized相同...原创 2018-08-16 15:46:10 · 283 阅读 · 0 评论 -
JAVA虚拟机并发编程读书笔记——JAVA虚拟机并发编程
英文版http://download.csdn.net/detail/rootfs/4040637作者:Venkat Subramaniam 薛笛译《Programming Groovy》《Programming Scala》《Practices of an Agile Developer》 Jolt生产力大奖同类书籍:Java内存模型以及如何保证线程安全和一致性方面提供了非常丰...原创 2019-06-21 11:43:46 · 186 阅读 · 0 评论 -
11. Thread Signaling
Table of ContentsThe purpose of thread signaling is to enable threads to send signals to each other. Additionally, thread signaling enables threads to wait for signals from other threads. For instance, a thread B might wait for a signal from thread A indi原创 2020-11-25 10:11:29 · 178 阅读 · 0 评论 -
13. Deadlock Prevention
In some situations it is possible to prevent deadlocks. I’ll describe three techniques in this text:Table of Contents1. Lock Ordering2. Lock Timeout3. Deadlock Detection1. Lock OrderingDeadlock occurs when multiple threads need the same locks but obtain原创 2020-11-25 10:21:07 · 181 阅读 · 0 评论 -
Java并发编程实战读书笔记——第二章 线程安全性
第二章 线程安全性如何通过同步来避免多个线程在同一时刻访问相同的数据。2.1 什么是线程安全性修复多线程问题的三种方式:a. 不在线程之间共享该状态变量b. 将状态变量修改为不可变的变量c. 在访问状态变量时使用同步正确的编程方法:首先使代码正确运行,然后再提高代码的速度。即使如此,最好也只是当性能测试结果和应用需求告诉你必须提高性能,以及测量结果表明这种优化在实际...原创 2018-06-28 23:20:01 · 281 阅读 · 0 评论 -
6. 线程安全与共享资源
**允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。**当多个线程同时更新共享资源时会引发竞态条件。因此,了解Java线程执行时共享了什么资源很重要。局部变量**局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的。**下面是基础类型的局部变量的一个例子:1 public void someMethod(){2 3 long threadSafeInt = 0;4 5 threadSafeInt++原创 2020-11-24 14:20:54 · 149 阅读 · 0 评论 -
8. Java同步块
**Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。**本文介绍以下内容:Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例Java 同步关键字(synchronized)Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将原创 2020-11-25 09:39:01 · 109 阅读 · 0 评论 -
Java并发编程实战读书笔记——第七章 取消与关闭
要使任务和线程能安全、快速、可靠地停止下来,并不容易。JAVA没有提供任何机制来安全也终止线程,但它提供了中断(Interruption),一种协作机制,使一个线程终止另一个线程的当前工作。这种协作式的方法是必要的,我们很少希望某个任务、线程立即停止,因为这种立即停止会使共享的数据结构处于不一致的状态。相反,在编写任务和服务时可以使用一种协作的方式:当需要停止时,它们首先会清除当前正在执行的工...原创 2018-08-12 09:40:32 · 263 阅读 · 0 评论