java
文章平均质量分 70
youaresherlock
江湖人称狗哥!
展开
-
RMI的基础原理
背景上世纪90年代, 焦点转移到跨平台通信-一台计算机可以通过某种类型网络在另一台计算机上发起一个动作CORBA、DCOM、Java RMI 技术等等,到现在的grpc等Hellopackage example.hello;import java.rmi.Remote;import java.rmi.RemoteException;public interface Hello extends Remote { String sayHello() throws RemoteExcep原创 2021-10-27 18:30:34 · 287 阅读 · 1 评论 -
Java多线程学习笔记13之线程间通信
详细代码见:github代码地址 本节内容:1) 生产者消费者模型 多个生产者和多个消费者: 操作值假死及解决 多个生产者和多个消费者: 操作栈假死及解决2) 通过管道进行线程间通信 线程间常用的通信方式介绍 PipedInputStream和PipedOutputStream字节流/PipedReader和PipedWriter字符流...原创 2018-10-26 23:38:40 · 309 阅读 · 0 评论 -
线程调度器和调度策略
线程调度器(Thread Scheduler): 操作系统的核心,它实际上就是一个常驻内存的程序,不断地对线程队列进行扫描,利用特定算法(时间片轮转法、优先级调度法、多级反馈队列调度法(MLFQ等),找出比当前占有CPU的线程更有CPU使用权的线程,并从之前的线程中收回处理器,再使待运行的线程占用处理器。 线程调度策略(Thread scheduling p...原创 2018-10-23 12:34:10 · 3799 阅读 · 0 评论 -
Java多线程学习笔记16之Lock的使用
详细代码见:github代码地址 本节内容:1) Lock接口/ReentrantLock类/lock()/unlock()方法文档翻译 翻译中包含了此重入锁与synchronized方法及语句块之间区别及优缺点2) 使用ReentrantLock实现同步第四章Lock的使用内容:Java5中的Lock对象也能实现同步的效果,而且在使用上也更加方便。...原创 2018-10-28 18:55:43 · 982 阅读 · 0 评论 -
Java的对象头和对象组成详解
目录一,对象头1,Mark Word2,指向类的指针3,数组长度二,实例数据三,对齐填充字节Java对象保存在内存中时,由以下三部分组成:1,对象头2,实例数据3,对齐填充字节一,对象头java的对象头由以下三部分组成:1,Mark Word2,指向类的指针3,数组长度(只有数组对象才有) 1,Mark WordMar...转载 2018-10-10 18:56:35 · 8640 阅读 · 6 评论 -
Java内存模型与对象揭秘
看了很多个关于Java内存模型的博客,这篇博客有着独到的见解.前言:最近看了《深入jvm》一书,感受颇深,但是不写点什么总感觉不是自己的,所以动手捋一捋。主要讲的内容是java的内存区域,对象的创建,对象的内存布局和对象的访问方式。一、java的内存区域划分这个问题几乎是面试官必问的问题,很多人都会直接回答:“堆和栈”。其实这种划分是很粗略的,要是遇到认真的面试官,你就尴尬了。说个题外...转载 2018-10-10 18:50:09 · 249 阅读 · 0 评论 -
线程栈
在Java虚拟机进程中,每个线程都会拥有一个方法调用栈(线程栈),用来跟踪线程运行中的一系列方法调用过程,栈中的每一个元素被称为栈帧,每当线程调用一个方法的时候会向方法栈中压入一个新帧。这里的帧用来存储方法的参数、局部变量、方法的返回地址、和运算过程中的临时数据。 线程栈模型是理解线程调度原理以及线程执行过程的基础。线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位...原创 2018-10-10 18:45:11 · 1887 阅读 · 0 评论 -
Java多线程学习笔记10之对象及变量的并发访问
详细代码见:github代码地址 本节内容:1) volatile关键字2) volatile与synchronized关键字的比较3) 内存模型4) 原子性、有序性、可视性5)原子类提供原子操作 4. volatile关键字 volatile关键字的主要作用是使变量在多个线程间可见,它强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变...原创 2018-10-19 20:48:25 · 336 阅读 · 0 评论 -
Java多线程学习笔记9之对象及变量的并发访问
详细代码见:github代码地址 本节内容:1) 多线程死锁条件2) 成员内部类和静态内部类同步3) 锁对象改变和锁对象属性的改变 1.多线程的死锁Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成。在多线程技术中,"死锁"是必须避免的,因为这会造成线程的"假死"Java死锁产生的四个必要条件:...原创 2018-10-19 20:34:56 · 250 阅读 · 0 评论 -
高并发中原子性、可见性、有序性
线程安全包含原子性和可见性两个方面,Java的同步机制都是围绕这两方面来确保线程安全的。Java的内存模型是围绕着在并发过程之中如何处理原子性,可见性和有序性这三个特征来建立的。下面我们来谈谈原子性、可见性、有序性 原子性 由java内存模型来直接保证的原子性变量操作包括read,load,assign,use,store,write,我们大致可以认为基本数据类型的...原创 2018-10-10 18:16:23 · 826 阅读 · 0 评论 -
Java多线程学习笔记8之对象及变量的并发访问
详细代码见:github代码地址 本节内容:1) 静态同步synchronized方法与synchronized(class)代码块2) Class锁可以对类的所有对象实例起作用 3) 数据类型String的常量池特性 6) 细化验证3个结论"synchronized(非this对象x)"格式的写法是将x对象本身作为"对象监视器",这样就可以得出以下3个结论...原创 2018-10-16 22:20:27 · 250 阅读 · 0 评论 -
Java多线程学习笔记11之线程间通信
详细代码见:github代码地址 本节内容:1) 等待/通知机制概念2) 中断和轮询两种基本的方式3) 等待/通知机制的实现4) wait()/notify()/wait(long)/notifyAll()文档翻译 线程间通信线程是操作系统中独立的个体,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理...原创 2018-10-23 18:15:55 · 231 阅读 · 0 评论 -
Java多线程学习笔记12之线程间通信
详细代码见:github代码地址 本节内容:1) wait()锁释放与notify()锁不释放2) 当interrupt()方法遇到wait()方法3) notify()与notifyAll()使用4) 方法wait(long)的作用5) notify()方法通知过早6) 调用wait()方法的条件变化,造成逻辑混乱7) 生产者消费者模式, 一个生产者和一个消...原创 2018-10-24 11:02:24 · 227 阅读 · 0 评论 -
Java多线程学习笔记22之增补拾遗
详细代码见:github代码地址 第七章本章内容:1. 线程组的使用2. 如何切换线程的状态3. SimpleDateFormat类与多线程的解决方案4. 如何处理线程的异常线程的状态线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中。我们看看Thread的类中的枚举类State代码: /** * A thread st...原创 2018-11-05 22:55:52 · 195 阅读 · 0 评论 -
Java多线程学习笔记21之单例模式与多线程
详细代码见:github代码地址 第六章单例模式与多线程前言:我之前已经开设了23个设计模式这个专栏,介绍了很多的Java设计模式,其中一些模式对于绝大多数编程语言设计思想都是类似的,需要了解单例模式的可以去看看。我们在实际开发中经常用到单例模式,但是同时也配合多线程来使用,我们需要考虑的是如何使单例模式遇到多线程是安全的、正确的。单例模式:1. 单例类只能有一个...原创 2018-11-04 16:59:04 · 249 阅读 · 0 评论 -
Java多线程学习笔记19之Lock的使用
详细代码见:github代码地址 本节内容:ReentrantLock 方法讲解及ReentrantReadWriteLock读写锁详解5)awaitUninterruptibly()6) awaitUntil(Date deadline)4. 使用ReentrantReadWriteLock类 1) ReentrantReadWriteLock英文文档阅读...原创 2018-11-02 17:25:49 · 384 阅读 · 0 评论 -
Java中对象头详解
一:对象头HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 HotSpot虚拟机的对象头(Object Header)包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,这部分数...转载 2018-11-04 12:15:08 · 721 阅读 · 0 评论 -
Java多线程学习笔记20之定时器Timer
详细代码见:github代码地址 本节内容: 定时器Timer的使用及分析1) 如何实现指定时间执行任务2) 如何实现按指定周期执行任务 第五章定时器Timer定时/计划功能在移动开发领域使用较多,比如Android技术、定时计划任务功能在Java中的主要使用的就是Timer对象,它的内部还是使用多线程的方式进行处理,所以它和线程技术还是有很大的关...原创 2018-11-03 17:06:54 · 351 阅读 · 0 评论 -
Java多线程学习笔记15之线程间通信
详细代码见:github代码地址 本节内容:1)ThreadLocal类的使用 JDK文档及方法翻译 InheritableThreadLocal的使用 5.类ThreadLocal的使用变量值的共享可以使用public static变量的形式,所有的线程都使用同一个public static 变量。但是如何让每一个线程都有自己的共享变量该如何解决呢...原创 2018-10-27 23:06:06 · 230 阅读 · 0 评论 -
Java多线程学习笔记14之线程间通信
详细代码见:github代码地址 本节内容:1) 实战 等待/通知之交叉备份2) 方法join的使用(Jdk文档翻译及源码解析) join()及join(long)的使用和实现原理 join(long)和sleep(long)的区别及源码分析 (3) 实战 等待/通知之交叉备份创建20个线程,其中10个线程是将数据备份到A数据库中,另外10个线程将...原创 2018-10-27 22:51:35 · 220 阅读 · 0 评论 -
Java多线程学习笔记17之Lock的使用
详细代码见:github代码地址 本节内容:1) Lock/ReentrantLock的newCondition()方法及Condition类/await、signal方法文档翻译2) Condition实现等待/通知使用(错误示例及正确示例)3) 使用多个Condition实现通知部分线程4) 实现消费者和生产者模型(利用await()及signal()方法) ...原创 2018-10-30 17:00:42 · 593 阅读 · 0 评论 -
Java多线程学习笔记18之Lock的使用
详细代码见:github代码地址 本节内容: 公平锁和非公平锁以及ReentrantLock常用方法的使用1) 公平锁和非公平锁2) getHoldCount()、getQueueLength()、getWaitQueueLength()3) hasQueueThread()、hasQueueThreads()、hasWaiters()4) lockInterr...原创 2018-10-31 23:24:24 · 415 阅读 · 0 评论 -
Java多线程学习笔记7之对象及变量的并发访问
详细代码见:github代码地址 本节内容:1) 出现异常,锁自动释放2) 同步不具有继承性3) synchronized同步语句块 synchronized方法的弊端 synchronized代码块间的同步性 将任意对象作为对象监视器 synchronized(非this对象x)同步代码块也可以解决"脏读"问题 7) 出...原创 2018-10-16 21:40:17 · 223 阅读 · 0 评论 -
Java多线程笔记详解
这是学习多线程知识的学习笔记,大家可以选择自己感兴趣的部分阅读学习详细代码见github代码 Java多线程学习笔记1之多线程基础内容:1) 基本概念以及线程的实现方法 Java多线程学习笔记2之多线程基础内容:1) 数据同步2) 非线程安全情况以及处理方法3) Java内存模型4) Thread.currentThread()抽象方法使用...原创 2018-10-09 15:50:42 · 558 阅读 · 0 评论 -
Java中的"对象监视器Monitor"和"对象锁"
在JVM的规范中,有这么一些话: “在JVM中,每个对象和类在逻辑上都是和一个监视器相关联的” “为了实现监视器的排他性监视能力,JVM为每一个对象和类都关联一个锁” “锁住了一个对象,就是获得对象相关联的监视器” 监视器好比一做建筑,它有一个很特别的房间,房间里有一些数据,而且在同一时间只能被一个线程占据,进入这个建筑叫做"进入监视器",进入建筑中的...转载 2018-10-16 10:43:11 · 6437 阅读 · 1 评论 -
Java序列化与反序列化
Java序列化简介Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据,有关对象的类型的信息和存储在对象中的数据的类型 将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据、还有对象中的数据类型可以用来在内存中新建对象 整个过程都是Java虚拟机(JVM)独立的,也就...原创 2018-09-27 12:43:37 · 222 阅读 · 0 评论 -
java中Serializable和Externalizable接口浅析
摘要: 本文主要要看看JDK中使用Serializable和Externalizable接口来完成Java对象序列化,并给出部分属性序列化的几种方式,最终做出Serializable和Externalizable接口的几个方面的对比。Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。从而达到网络传输、本地存储的效果。本文主要要...转载 2018-09-26 17:08:04 · 1553 阅读 · 1 评论 -
Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?翻译
前面我们的学习笔记中讲解Thread类中一些废弃的方法及原因,同时又示例代码。现在我们来翻译官方给出的文档Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?。 """本文是我学习Java多线程以及高并发知识的第一本书的学习笔记,书名是<<Java多线程编程核心技术>>,作者是大佬...原创 2018-10-11 13:04:59 · 881 阅读 · 1 评论 -
Java并发中锁和监视器
锁和监视器之间的区别 – Java并发在面试中你可能遇到过这样的问题:锁(lock)和监视器(monitor)有什么区别?嗯,要回答这个问题,你必须深入理解Java的多线程底层是如何工作的。简短的答案是,锁为实现监视器提供必要的支持。详细答案如下。锁(lock)逻辑上锁是对象内存堆中头部的一部分数据。JVM中的每个对象都有一个锁(或互斥锁),任何程序都可以使用它来协调对对象的多...转载 2018-10-11 11:59:28 · 325 阅读 · 0 评论 -
Java多线程学习笔记4之多线程基础
详细代码见:github代码地址 本节内容:1) 判断线程是否是停止状态(Thread.interrupted()、this.isInterrupted()方法)2) 通过抛出异常或者return来真正停止线程3) stop()方法暴利停止线程以及它被废弃原因4) 一对方法来暂停和恢复线程(suspend()和resume()) 1. 我们可以判断一下线程是否是...原创 2018-10-01 10:04:55 · 238 阅读 · 0 评论 -
Java多线程wait和sleep方法区别
两者的区别这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。 wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围) sleep必须捕获异常,而wait,notify和notifyA...转载 2018-10-01 09:43:07 · 488 阅读 · 0 评论 -
Java中深拷贝和浅拷贝(deepcopy和shallowcopy)
原型模式要求用深拷贝(复制/克隆)的方式实现,对这个概念很模糊。在自己查了相关资料后,我将从三个方面讲述深浅拷贝:图形表述深浅拷贝区别及特点 Object类中的clone()方法实现深浅拷贝 实际应用中深浅拷贝区别一 图形表述深浅拷贝区别及特点前提:深浅拷贝基本上都是讨论引用类型的变量(对象,String类等),对基本数据类型的变量,深浅拷贝都是要复制的。下面以图形的形式表述深浅拷贝...转载 2018-09-20 10:20:41 · 2002 阅读 · 0 评论 -
java中对象的相等
我之前写过关于这里的文章,这里我重新写一篇文章Java中Object类中的hashCode()和equals()方法如下所示: public boolean equals(Object obj) { return (this == obj); } public int hashCode() { int lockWord = shadow$_monitor_;...原创 2018-05-07 17:05:06 · 822 阅读 · 0 评论 -
java标示接口
大家可能会见到一些接口中没有任何的抽象方法,我们知道接口是完全的抽象类,它的作用就是为了实现多继承,避免菱形继承的问题,以及作出一些规定和规则。1、什么是标记接口?Java中把没有定义任何方法和常量的接口称之为标记接口,我们经常使用的比较多的是“”Serializable“”,这个接口也是没有定义人任何方法和常量的。2、标记接口的作用?标记接口在Java中有什么作用呢?其实标记接口从名字就可以理解...原创 2018-04-26 18:57:16 · 141 阅读 · 0 评论 -
Java外部类为何只能用public和default进行修饰
对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。可以满足所有的情况了。如果类使用了private修饰符,说明是个内部类。内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(...转载 2018-09-27 22:45:06 · 1100 阅读 · 0 评论 -
java代码反编译
javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。大家也可以自己去http://jd.benow.ca/官网下载对应操作系统的jd-gui工具一般情况下,很少有人使用javap对class文件进行反编译,因为有很多成熟的反编译工具可以使用,比如jad。但是,javap还可以查看java编译器为我们生成的字节码。通过它,可以对照源代码和字节码,从而...原创 2018-09-28 09:41:27 · 2991 阅读 · 0 评论 -
Java线程调度器
每个虚拟机都有一个线程调度器,确实在任何时刻运行哪个线程。有两种线程调度器:1、抢占式(preemptive)2、协作式(cooperative) 抢占式线程高度器确实线程何时已经公平地享用了CPU时间,然后暂停此线程上,将CPU控制权交给另外的线程。协作式线程调度器会在将CPU控制权交给其他线程前,等待运行中的线程自己斩停。与使用抢占式线程式调度的虚拟机相比,使用协作式线程调度器...原创 2018-09-28 11:32:28 · 4545 阅读 · 0 评论 -
Java多线程学习笔记5之多线程基础
详细代码见:github代码地址 本节内容:1) suspend与resume方法的缺点和代码案例2) yeild()方法的使用3) 线程的优先级详解4) java中的守护线程和用户线程 1. suspend与resume方法的缺点在使用suspend与resume方法时,如果使用不当,极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象...原创 2018-10-09 15:41:06 · 198 阅读 · 0 评论 -
Java多线程学习笔记3之多线程基础
详细代码见:github代码地址 本节内容:1) Thread类中的isAlive()、sleep()、getId()、停止线程的方法(interrupt())、2) interrupted()方法和isInterrupted()方法区别和使用 isAlive()方法判断当前的线程是否处于活动状态 public final boolean isAlive()...原创 2018-09-30 11:42:45 · 292 阅读 · 0 评论 -
竞态条件(race condition)
在学习多线程的过程中,因为是非科班学生,操作系统的东西都是一知半解的,所以很多名词都没有理解,另外具体的Java虚拟机如何工作还需要后续的学习,这里只能慢慢学习了,等到这本书看完好好读读操作系统的东西以及Java虚拟机机制下面是一个博文讲解了竞态条件的基本概念和常见的情况竞态条件(Race Condition):计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件。最常见的竞态...转载 2018-10-09 10:12:15 · 1467 阅读 · 0 评论