![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 87
猿小许
小沙弥: Java不平,何以平天下! 热衷研究各种Java技术栈,共同学习。
展开
-
实践式理解浅拷贝与深拷贝
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。举例说明:比如,对象A和对象B都属于类S,具有属性a和b。那么对对象A进行拷贝操作赋值给对象B就是:B.a=A.a; B.b=A.b;在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用现有对象的部分或全部 数据。Java中的对象拷贝主要分为:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。先介绍一点铺垫知识:Java中的数据类型分为基本数据.原创 2021-10-27 16:55:09 · 75 阅读 · 0 评论 -
读写锁 ReadWriteLock解析
相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些。假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。Java5在java.util.concurrent包中已经包含了读写锁。原创 2021-09-15 18:10:38 · 526 阅读 · 0 评论 -
线程饥饿和线程公平的处理分析
如果一个线程因为CPU时间全部被其他线程抢走而得不到CPU运行时间,这种状态被称之为“饥饿”。而该线程被“饥饿致死”正是因为它得不到CPU运行时间的机会。解决饥饿的方案被称之为“公平性” – 即所有线程均能公平地获得运行机会。下面是本文讨论的主题:1、Java中导致饥饿的原因:高优先级线程吞噬所有的低优先级线程的CPU时间。线程被永久堵塞在一个等待进入同步块的状态。线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法)。2、 在Java中实现公平性方案,需要:使用原创 2021-09-10 14:00:29 · 734 阅读 · 0 评论 -
线程间的通信介绍与分析
线程通信是目标是使线程间能够互相发送信号。另一方面,线程通信始线程能够等待其他线程的信号。例如,线程B可以等待线程A的一个信号,这个信号会通知线程B数据已经准备好了。本文将讲解以下几个Java线程间通信的主题:通过共享对象通信忙等待wait(),notify()和notifyAll()丢失的信号假唤醒多线程等待相同信号不要对常量字符串或全局对象调用wait()通过共享对象通信线程间发送信号的一个简单方式是在共享对象的变量里设置信号值。线程A在一个同步块里设置boolean型成员变量h原创 2021-09-10 11:45:54 · 178 阅读 · 0 评论 -
同步代码块synchronized的使用与解析
Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例Java同步关键字synchronizedJava中的同步代码块用synchronized标记。同步代码块在Java中是同步在某个对象上。所有同步在一个对象上的同步代码块在同一时刻只能被一个线程进入操作。所有其他等待进入该同步块的线程将会被原创 2021-09-10 10:20:37 · 865 阅读 · 0 评论 -
Java内存模型与CPU如何操作线程分析
Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。一、Java内存模型如果你想设计表现良好的并发程序,理解Java内存模型是非常重要的。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。原始的Java内存模型存在一些不足,因此Java内存模型在Java1.5时被重新修订。这个版本的Java内存模型在Java8中人在使用。原创 2021-09-09 18:32:29 · 128 阅读 · 0 评论 -
线程安全与共享资源介绍与分析
一、竞态条件与临界区 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的。多线程同时执行下面的代码可能会出错:public class Counter { protected long count = 0;原创 2021-09-09 17:35:01 · 205 阅读 · 0 评论 -
如何创建并运行java线程
一般编写线程运行时执行的代码大致有两种方式:一种是创建Thread子类的一个实例并重写run方法第二种是创建类的时候实现Runnable接口。接下来我们会具体讲解这两种方法Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:Tread thread = new Thread();执行该线程可以调用该线程的start()方法:thread.start();在上面的例子中,我们并没有为线程编写运行代码,因原创 2021-09-09 17:02:51 · 261 阅读 · 0 评论 -
并发编程模型介绍与分析
并发系统可以采用多种并发编程模型来实现。并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业。不同的并发模型采用不同的方式拆分作业,同时线程间的协作和交互方式也不相同。这篇并发模型教程将会较深入地介绍目前(2015年,本文撰写时间)比较流行的几种并发模型。一、并发模型与分布式系统之间的相似性本文所描述的并发模型类似于分布式系统中使用的很多体系结构。在并发系统中线程之间可以相互通信。在分布式系统中进程之间也可以相互通信(进程有可能在不同的机器中)。线程和进程之间具有很多相似的特性。这也就是为什么很原创 2021-09-09 16:27:10 · 285 阅读 · 0 评论 -
Java并发性和多线程的介绍与分析
在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。一、多线程的发展由来随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间、所有的内存和其他计算机资源。一个好的程序榜样是在其不再使用这些资源时对其进行释放,以使得其他程序能有机会使用这些资源。再后来发展原创 2021-09-09 16:14:36 · 117 阅读 · 0 评论 -
六、NIO教程——Selector选择器的讲解与使用
Java NIOSelector是一个组件,它可以检查一个或多个Java NIO 通道 实例,并确定哪些通道准备好进行读取或写入等操作。通过这种方式,单个线程可以管理多个通道,从而管理多个网络连接。1、为什么使用选择器?仅使用单个线程来处理多个通道的优点是您需要更少的线程来处理通道。实际上,您可以只使用一个线程来处理您的所有频道。对于操作系统来说,线程之间的切换是昂贵的,并且每个线程也占用操作系统中的一些资源(内存)。因此,使用的线程越少越好。但请记住,现代操作系统和 CPU原创 2021-09-06 15:26:05 · 1178 阅读 · 0 评论 -
五、NIO教程—通道(Channel)和缓冲区(Buffer)讲解
Java NIO (New IO) 是 Java 的替代 IO API,意思是标准Java IO和Java Networking API 的替代 。Java NIO 提供了与传统 IO API 不同的 IO 编程模型。注意:有时 NIO 被称为非阻塞 IO。然而,这并不是作者最初的意思,最初应该指的是New IO更为恰当一点。此外,部分 NIO API 实际上是阻塞的——例如文件 API——所以标签“非阻塞”会有点误导。一、什么是非阻塞IO1.1 非阻塞原创 2021-09-01 10:53:56 · 1452 阅读 · 0 评论 -
一、你真的了解IO/NIO吗?NIO是非阻塞输入输出流?
要想真正的搞明白各种IO,我们就要一个个从原理上对他们进行分析,这样才能记得更深,更好的去使用他们。当然最重要的是要把面试官怎么给怼懵逼。最传统的一种 IO 模型,即在读写数据过程中会发生阻塞现象。当用户线程发出 IO 请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出 CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除 block 状态。一、各种IO模型1.1 阻塞 IO 模型最传统的一种 IO 模型,即原创 2021-08-31 18:28:45 · 478 阅读 · 0 评论 -
四、缓冲输入输出流BufferedReader/BufferedWriter解析与使用
在Java的 的BufferedReader类,java.io.BufferedReader提供缓冲为您的JavaReader实例。缓冲可以大大加快 IO。Reader不是一次从底层读取一个字符,而是一次BufferedReader读取一个更大的块(数组)。这通常要快得多,特别是对于磁盘访问和更大的数据量。BufferedReader类似于BufferedInputStream 但它们并不完全相同。之间的主要区别BufferedReader和 BufferedInputStream是BufferedRea原创 2021-08-31 18:15:33 · 3375 阅读 · 0 评论 -
三、 Java对本地文件进行操作
Java IO API 中 的Java File类java.io.File使您可以访问底层文件系统。使用 Java File 类,您可以:检查文件或目录是否存在;如果目录不存在,则创建一个目录;读取文件的长度;重命名或移动文件;删除一个文件;检查路径是文件还是目录;读取目录中的文件列表。这个 Java 文件教程将告诉您更多关于如何操作的信息。注意:Java File 类只允许您访问文件和目录元数据。如果您需要读取或写入文件的内容,您应该使用FileIn原创 2021-08-31 16:51:46 · 696 阅读 · 0 评论 -
二、文件输入输出流FileInputStream/FileOutputStream解析与使用
一、阻塞式IO模型 Java IO是Java自带的 API,用于读取和写入数据(输入和输出)。大多数应用程序需要处理一些输入并根据该输入产生一些输出。例如,从文件或通过网络读取数据,然后通过网络写入文件或写回响应。 Java IO API 位于 Java IO 包 ( java.io) 中。如果您查看包中的 Java IO 类,那么java.io大量的选择可能会令人困惑。所有这些课程的目的是什么?对于给定的任务,您应该选择哪一个?你如原创 2021-08-31 16:24:39 · 6758 阅读 · 0 评论 -
ThreadLocal 本地线程变量介绍及使用场景
一、本地线程变量使用场景 并发应用的一个关键地方就是共享数据。如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性。这意味着,如果你在一个线程里改变一个属性,全部的线程都会受到这个改变的影响。 有时,你希望程序里的各个线程的属性不会被共享。 Java 并发 API提供了一个很清楚的机制叫本地线程变量即ThreadLocal。 模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程转载 2021-07-31 16:58:09 · 1094 阅读 · 0 评论 -
集合框架——Map篇
Map集合特点1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)2.Map集合中的元素,key和value的数据类型可以相同,也可以不同3.Map集合中的元素,key是不予许重复的,value是可以重复的4.Map集合中的元素,key和value是一一对应的HashMap的方法:clear() -> 移除所有映射关系equals(Object key) -> 比较指定的对象与此映射是否相等原创 2021-07-06 14:37:15 · 68 阅读 · 0 评论 -
LinkedList的实现原理与使用
一、LinkedList的概述 LinkedList是双向链表实现的ListLinkedList是非线程安全的LinkedList元素允许为null,允许重复元素LinkedList是基于链表实现的,因此插入删除效率高,查找效率低(虽然有一个加速动作)LinkedList是基于链表实现的,因此不存在容量不足的问题,所以没有扩容的方法LinkedList还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用二、LinkedList的分析LinkedList的存储结构LinkedL原创 2021-07-06 14:23:15 · 381 阅读 · 0 评论 -
ArrayList的底层实现原理
ArrayList的底层实现原理两者主要区别:xArrayList不是线程安全的vector 是线程安全的一、 ArrayList概述:ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返 回一个线程安全的ArrayList类,也可以使用concurrent并发包下的C原创 2021-07-06 14:21:55 · 425 阅读 · 0 评论