Java
文章平均质量分 74
HCH996
一边失去,一边在寻找~
展开
-
为何说只有 1 种实现线程的方法?
实现线程的方式实现 Runnable 接口publicclassRunnableThreadimplementsRunnable{@Overridepublicvoidrun(){System.out.println('用实现Runnable接口实现线程');}}继承 Thread 类publicclassExtendsThreadextendsThread{@Overridepublic...原创 2021-02-16 18:00:44 · 170 阅读 · 0 评论 -
volatile 的作用是什么?与 synchronized 有什么异同?
volatile 是什么?首先我们就来介绍一下 volatile,它是 Java 中的一个关键字,是一种同步机制。当某个变量是共享变量,且这个变量是被 volatile 修饰的,那么在修改了这个变量的值之后,再读取该变量的值时,可以保证获取到的是修改后的最新的值,而不是过期的值。 相比于 synchronized 或者 Lock,volatile 是更轻量的,因为使用 volatile 不会发生上下文切换等开销很大的情况,不会让线程阻塞。但正是由于它的开销相对比较小,所以它的效果,也就是能力,相对也小原创 2021-01-24 14:18:45 · 481 阅读 · 0 评论 -
可见性问题
能够保证可见性的措施除了 volatile 关键字可以让变量保证可见性外 synchronized、Lock、并发集合等一系列工具都可以在一定程度上保证可见性synchronized 不仅保证了原子性,还保证了可见性关于 synchronized 这里有一个特别值得说的点,我们之前可能一致认为,使用了 synchronized 之后,它会设立一个临界区,这样在一个线程操作临界区内的数据的时候,另一个线程无法进来同时操作,所以保证了线程安全。 其实这是不全面的,这种说法没有考虑到可见性问题,完整原创 2021-01-24 14:11:22 · 378 阅读 · 1 评论 -
Java 中的原子操作有哪些注意事项?
什么是原子性和原子操作在编程中,具备原子性的操作被称为原子操作。原子操作是指一系列的操作,要么全部发生,要么全部不发生,不会出现执行一半就终止的情况。 比如转账行为就是一个原子操作,该过程包含扣除余额、银行系统生成转账记录、对方余额增加等一系列操作。 虽然整个过程包含多个操作,但由于这一系列操作被合并成一个原子操作,所以它们要么全部执行成功,要么全部不执行,不会出现执行一半的情况。 比如我的余额已经扣除,但是对方的余额却不增加,这种情况是不会出现的,所以说转账行为是具备原子性的。而具有原子性的原子原创 2021-01-24 14:01:52 · 272 阅读 · 0 评论 -
什么是指令重排序?为什么要重排序?
什么是重排序假设我们写了一个 Java 程序,包含一系列的语句,我们会默认期望这些语句的实际运行顺序和写的代码顺序一致。 但实际上,编译器、JVM 或者 CPU 都有可能出于优化等目的,对于实际指令执行的顺序进行调整,这就是重排序。重排序的好处:提高处理速度图中左侧是 3 行 Java 代码,右侧是这 3 行代码可能被转化成的指令。 可以看出 a = 100 对应的是 Load a、Set to 100、Store a,意味着从主存中读取 a 的值,然后把值设置为 100,并存储回去,同理原创 2021-01-24 13:55:51 · 7177 阅读 · 5 评论 -
什么是Java内存模型
容易混淆:JVM 内存结构VS Java 内存模型Java 作为一种面向对象的语言,有很多概念,从名称上看起来比较相似,比如 JVM 内存结构、Java 内存模型,这是两个截然不同的概念。JVM 内存结构和 Java 虚拟机的运行时区域有关; Java 内存模型和 Java 的并发编程有关。JVM 内存结构(就是堆、虚拟机栈、方法区、程序计数器、本地方法栈等几个类别)从 Java 代码到 CPU 指令看完了 JVM 内存结构,回到 Java 内存模型上来。编写的 Java 代码,最终还.原创 2021-01-23 17:39:33 · 273 阅读 · 3 评论 -
面向对象与面向过程的本质的区别
面向对象和面向过程面向过程分析出解决问题所需要的步骤,然后用函数调用把这些步骤一步一步实现。使用的时候一个一个依次调用即可。面向对象对现实世界的抽象,现实师姐存在的任何事务都可以称之为对象,有着自己独特的个性。 面向对象就是构成问题事务分解的各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事务在整个解决问题的步骤中的行为。可以拿生活中的实例来理解面向过程与面向对象例如五子棋面向过程的设计思路就是首先分析问题的步骤1、开始游戏, 2、黑子先走, 3、绘制画面, 4原创 2021-01-23 16:47:27 · 200 阅读 · 1 评论 -
Comparable和Comparator的区别
最大的区别为:Comparable作用在内部,而Comparator作用在外部public class Student implements Comparable<Student>{public String name;public int age;public Student(String name, int age){ this.name = name; this.age = age;}@Overridepublic String toString()原创 2021-01-21 15:43:26 · 128 阅读 · 1 评论 -
详解 ThreadPoolExecutor 的参数含义及源码执行流程
线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入“池”中,当有任务来临时就可以重用已有的线程,无需等待创建的过程,这样就可以有效提高程序的响应速度。 但如果要说线程池的话一定离不开 ThreadPoolExecutor ,在阿里巴巴的《Java 开发手册》中是这样规定线程池的: 线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的读者更加明确线程池的运行规则,规避资源耗尽的风险。 说明原创 2021-01-06 11:24:56 · 503 阅读 · 0 评论 -
Java中的锁
Java中的锁主要用于保障多并发线程情况下数据的一致性。 在多线程编程中为了保障数据的一致性,我们通常需要在使用对象或者方法之前加锁,这时如果有其他线程也需要使用该对象或者该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会进入阻塞队列等待锁的释放,直到其他线程执行完成并释放锁,该线程才有机会再次获取锁进行操作。 这样就保障了在同一时刻只有一个线程持有该对象的锁并修改对象,从而保障数据的安全。 锁从乐观和悲观的角度可分为乐观锁和悲观锁 从获取资源的公平性角度可分为公平锁和非公平锁 从原创 2020-12-24 22:52:11 · 137 阅读 · 1 评论 -
Java JUC线程
volatile变量的可见性和原子性问题(不可保证)volatile变量不能保证原子性原子性:也叫作不可分割性(!!!京东面试题)i++:涉及到了三个操作: 读-改-写(这三步是可以分割的)对于每个线程中的i变量int temp = sn;sn = temp + 1;如果不用volatile修饰这两步操作都是在各自的线程缓存中进行的但如果直接利用volatile修饰,可以看成是直接在内存中进行操作。如何保证操作的原子性呢?-jdk1.5以后提供了原子变量(类...原创 2020-12-19 13:27:17 · 450 阅读 · 2 评论 -
Java基础
目录一、集合(1)List:可重复1. ArrayList:基于数组实现,增删慢,查询快,线程不安全.2. Vector:基于数组实现,增删慢,查询快,线程安全3.LinkedList:基于双向链表实现,增删快,查询慢,线程不安全(2) Queue 队列(3) Set:不可重复1. HashSet: HashTable实现,无序2. TreeSet: 二叉树实现3. LinkHashSet:HashTable实现数据存储,双向链表记录顺序(4) Map...原创 2020-12-15 21:51:57 · 762 阅读 · 0 评论 -
Java中常见关键字this static final
目录this关键字static关键字1. 修饰属性2. 修饰方法3. 修饰代码块4. 修饰内部类final关键字1.修饰变量2.修饰方法3.修饰类this关键字内存分析this指的是正在使用的对象(指向的是自己)(1) this可以修饰属性当属性名字和形参发生重名的时候,或者 属性名字和局部变量重名的时候,都会发生就近原则,所以如果我要是直接使用变量名字的话,就指的是离得近的那个形参或者局部变量,这时候如果我想要表示属性的话,再前面...原创 2020-12-13 21:08:27 · 278 阅读 · 0 评论 -
Java对象
目录解释对象的创建过程DCL单例到底需不需要volatile对象在内存中的存储布局对象头包括什么对象怎么定位对象怎么分配一个Object占多少个字节Class对象是在堆还是在方法区Object obj = new Object()解释对象的创建过程DCL单例到底需不需要volatile需要线程间可见 禁止重排序:禁止对volatile修饰过的内存的读写重排序双重检查的好处也可以提高效率,因为如果不为空的话,只需要在用户态作一个小小的是否...原创 2020-12-13 13:01:08 · 188 阅读 · 0 评论 -
Synchronized字节码原理+偏向锁升级过程
Synchronized关键字锁的是this对象public synchronized void m(){ synchronized(this){ }}锁的是当前类的.classpublic static synchronized void m{ //类似于 //synchronized(Test.class);}锁的是指定的对象Object o = new Object();synchronized(o){}不持有锁的线程咋办?忙等待;原..原创 2020-12-13 10:54:47 · 229 阅读 · 0 评论 -
注解
目录AnnotationJDK自带注解自定义注解注解使用@Target@Retention解析注解AnnotationAnnotation注解是一种新的类型,与接口很相似,它与类、接口、枚举是平级的。注解相当于是一种标记,以@符号开头。一般写作@xxx,可以声明在类、属性、方法和参数等的前面。用来对这些元素进行说明,标注或实现特定功能。JDK自带注解在java.lang包中 注解 作用 @Override..原创 2020-12-11 13:46:19 · 254 阅读 · 0 评论 -
类反射
目录类加载反射Class对象的创建获取class对象1. 调用对象的getClass()方法2. 调用类的class属性3. 调用Class类的forName()静态方法利用反射创建对象的几种方式类加载将class文件读取到内存中的过程..class文件的加载由ClassLoader完成,成为类加载器,有三种类型BootStrapLoader:启动类加载器,由C++编写,由JVM在启动时候加载和初始化的,主要负责加载%JAVA_HOME%jre/lib路径下类。.原创 2020-12-11 11:23:22 · 882 阅读 · 0 评论 -
Java内部类
Java内部类成员内部类可以无条件访问外部类的所有成员属性的成员方法(包括private成员或者静态成员) 如果要访问外部类的同名成员,需要这样访问 外部类.this.成员变量 外部类.this.成员方法 在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的独享,再通过这个对象的引用来访问。 创建成员内部类的对象,前提是必须存在一个外部类的对象 第一种方式: Outer outer = new Outer; Outer.Inter inter = outer.new I原创 2020-11-29 10:48:06 · 107 阅读 · 0 评论 -
Java多线程
wait, notity, notifyAll阻塞唤醒确切过程阻塞:这三个方法的调用都会使当前线程阻塞。该线程将会被放置到对该Object的请求等待队列中,然后让出当前对Object所拥有的所有的同步请求,线程会一直暂停,直到下面其中一种情况发生:其他线程调用了该Object的notify方法,而该线程刚好是哪个被唤醒的线程; 其他线程调用了该Object的notifyAll方法;唤醒: 线程会从等待队列中移除,重新称为可调度线程,与其他线程以常规的方式竞争对象的同步请求。一旦它获得了对象的同步原创 2020-11-23 10:14:53 · 235 阅读 · 2 评论 -
Java程序员面试秘笈
简单描述Java开发包的种类?Jva ME:一种以广泛的消费性产品为目的的高度优化的Java运行环境,包括寻呼机、移动电话、可视电话、数字机顶盒等,它是致力于消费产品和嵌入式设备的开发人员的最佳选择。Java SE: 是针对桌面开发以及低端商务计算解决方案而开发的版本Java EE: 是一种利用Java平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE的基础是JAVA SE、J2EE不仅巩固了标准版中的许多优点,同时还提供了对EJB、Servlets、JSP以及XML技术原创 2020-11-05 21:54:57 · 173 阅读 · 1 评论 -
Java碎语法
如何将字符数组转换为String类?String s = String.valueOf(chas);将map中的value转换为List<List<String>>();List<List<String>> res = null;Map<String, List<String>> = new HashMap<>();//往map中添加很多值之后res = new ArrayList(map.value原创 2020-11-05 10:57:39 · 166 阅读 · 0 评论 -
桥接模式
手机操作问题传统方案解决手机操作问题传统方案解决手机操作问题分析1) 扩展性问题(类爆炸),如果我们再增加手机样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加2) 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本。3) 解决方案-使用桥接模式基本模式1)桥接模式(Bridge模式):将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变2)是一种结构型设计模式3)..原创 2020-11-04 18:19:53 · 116 阅读 · 0 评论 -
Java集合
Java集合总体结构迭代器Iterator(迭代器)是一个接口,用于遍历Collection中的元素 Collection接口中的iterator()方法返回Iterator接口的实例; Iterator主要提供的方法有:boolean hasNext() Object next() void remove()for(Object obj : c){ System.out.println(obj); if(obj.equals("悟空")){ c.remove(obj); }.原创 2020-10-28 21:11:10 · 200 阅读 · 2 评论 -
JAVA异常
Java的异常体系try catch语句try{ 业务逻辑层} catch(AException e){ A异常的处理代码} catch(BException e){ B异常的处理代码}...无论哪行代码发生异常,系统都会生成一个异常对象,这与try...catch...语句没有关系 若程序没有对这个异常做任务处理,则程序在此退出,以前的程序中遇到的异常都是这种情况 创建异常对象后,JVM会寻找可以处理它的catch块,并将异常对象交给这个catch去块处原创 2020-10-28 08:14:44 · 238 阅读 · 0 评论 -
线程的生命周期-线程控制
线程的五种状态新建(New) 就绪(Ready) 运行(Running) 阻塞(Blocked) 死亡(Dead)代码实例public class ThreadDemo2 { public static void main(String [] args){ Thread thread0 = new Thread(new ThreadTask()); Thread thread1 = new Thread(new ThreadTask());...原创 2020-10-26 17:11:51 · 146 阅读 · 0 评论 -
Java多线程
目录Java的线程模型线程的创建三种方式三种方式的比较Java的线程模型Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例 线程用于完成一定的任务(执行一段程序流), Java使用线程执行体来代表这段程序流 线程的使用过程:定义线程体》创建线程对象》调用线程对象的方法以启动线程创建线程对象只有一种方式,但定义线程执行体有多种方式线程的创建方式继承Thread类,重写run()方法 定义Thread类的子类,并重写该类的run()原创 2020-10-26 15:14:04 · 153 阅读 · 0 评论 -
线程和进程的概念
进程进程是处于运行过程中的程序,具有独立的功能,是系统进行资源分配和调度的独立单位独立性 进程是系统中独立存在的实体,它拥有自己独立的资源,每一个进程都拥有自己私有的地址空间,在没有经过进程本身允许的情况下,一个进程不能直接访问其他进程的地址空间;(音乐播放应用程序不能访问QQ浏览器的内存)动态性 进程是一个正在系统中活动的指令集合,包含了时间的概率,具有自己的生命周期和状态;并发性 在当个处理器上,多个进程可以并发地执行,并且在执行时它们彼此之间不会相互影...原创 2020-10-26 11:01:59 · 187 阅读 · 0 评论 -
Java代码是如何运行起来的?
目录1.编译2.类加载3.链接4.初始化(链接完成之后执行)二、类初始化和实例初始化面试题1.类初始化过程2.子类的实例初始化就是执行方法3.创建第二个Son对象1.编译写好:”.java”代码后,会通过编译器将代码编译成.class后缀的字节码文件 Java是平台无关的,实现语言无关性的基础就是虚拟机和字节码存储格式 只要编译器按照虚拟机规范,编译成对应的class文件,这个class文件就能够被JVM加载,不同的操作系统通过运行对应版本JVM来载入这个..原创 2020-10-26 10:00:33 · 907 阅读 · 0 评论 -
Java网络编程
目录基于TCP和UDP协议的通信InetAddress基于TCP协议的通信,一次请求的对接基于TCP协议的通信,实现一个聊天室基于UDP协议的通信,简陋地模拟游戏关闭服务通知场景基于TCP和UDP协议的通信基于TCP/IP协议的通信TCP/IP协议会在通信两端建立连接(虚拟链路),用于发送和接收数据; TCP/IP协议是一种可靠的网络协议,它通过重发机制来保证这种可靠性;通信的实现Serversocket用于监听来自客户端的连接,当没有连接时它处于阻塞状态; 客户端原创 2020-10-25 22:24:44 · 285 阅读 · 0 评论 -
ConcurrentHashMap线程安全机制以及源码分析
1. JDK8中基于HashEntry(首节点)进行线程安全同步保证(在首节点进行加锁)2.通过Node+CAS+Synchronized机制来完成 static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; volatile V val; volatile Node<K,V> ne..原创 2020-10-24 21:55:39 · 242 阅读 · 1 评论 -
高并发请求下使用ThreadLocal管理用户信息
目录保持客户端和服务端会话状态的方式:Cookie+SessionThreadLocal管理用户信息ThreadLocal在spring框架中的应用总结保持客户端和服务端会话状态的方式:Cookie+SessionHTTP协议是非连接性的,完成操作关闭浏览器后,链接就断开了。所以必须要有一种机制让保证会话的连续性,也就是Session机制 当开始一个会话时创建一传Session,并为其赋予一个独一无二的号码sessionID或者其他有用的信息如用户名等等,下一次访问的时候,传.原创 2020-10-24 19:31:33 · 2046 阅读 · 0 评论 -
ThreadLocal的底层原理
一、ThreadLocal原理ThreadLocal与线程同步机制不同,线程同步机制是多个线程共享同一个变量,对这个共享变量的修改,通过无锁或者有锁的机制保证线程的安全 而ThreadLocal是为每一个线程,创建一个只属于它自己的变量副本,线程可以改变自己所拥有的变量副本,而不会影响其他线程所对应的副本 简而言之,往ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的 一个线程使用自己的局部变量比使用全局变量方便且安全,因为局部变量只有线程自己能看见,不会影响其他线程.原创 2020-10-24 18:11:26 · 4148 阅读 · 0 评论 -
volatile域
目录一、volatile的可见性、有序性、原子性volatile保证可见性volatile保证有序性volatile不能保证原子性二、volatile变量的应用场景场景一:状态标志场景二:线程安全的双重检查单例模式应用场景三-volatile bean应用场景四-读-写锁策略(分段锁的具体实现方式)总结一、volatile的可见性、有序性、原子性volatile保证可见性某个共享变量如果被一个线程给修改了,其他线程能够立即知道这个修改操作 线程的..原创 2020-10-24 11:50:22 · 333 阅读 · 0 评论 -
线程池相关内容
线程池线程是重量级对象创建与销毁一个线程并不像创建一个对象那么简单,需要调用操作系统内核的 API,整个过程是一个偏重且耗时的操作 并发的线程数量很多,且执行时间很多的任务就结束,频繁的创建与销毁会大大降低系统效率 需要一种办法可以对线程进行重复利用,完成任务后并不被销毁,可以继续执行其他任务线程池的设计思路线程池是一种线程的使用模式,它为了降低线程使用过程中,频繁的创建和销毁所带来的资源消耗与代价 提前创建一定数量的线程,他们时刻准备着,在新任务到达后就开始执行;在完成任务后,再重新回原创 2020-10-23 18:39:11 · 133 阅读 · 0 评论 -
无锁机制CAS及其底层实现原理
1. 利用锁的同步机制class SafeCounter{ private int count; //同一时间只有一个线程可以进入add方法 public synchronized void add(){ //复合操作 this.count ++; }}public static void main(String[] args) { SafeCounter safeCounter = new SafeCou.原创 2020-10-23 12:38:28 · 869 阅读 · 2 评论 -
Synchronized和Lock锁
protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); //得到当前线程 int c = getState();//得到计数器的值 if (c == 0) {//如果为0,表示锁没有被任务线程持有 if (!hasQueuedPredecessors() &...原创 2020-10-23 12:23:45 · 362 阅读 · 0 评论 -
多线程的上下文切换-影响-如何优化
线程的上下文切换上下文切换1.对于CPU而言,在一个时刻只能运因自身原因被迫暂停运行,此时另一个线程会被操作系统选中来占用处理器行一个线程,当一个线程的时间片用完,或者2.当CPU结束运行一个线程,转去执行另外一个线程,这个过程就叫做线程上下文切换上下文1.在发生切换的时候,当前线程的任务可能并没有执行完毕。所以在切换时需要保存线程切换前的运行状态,以便下一次,可以接着切换之前的状态继续执行后续的任务2.切出切入的过程中,操作系统需要保存和恢复相应的进度信息,这个进度信息就是上下文原创 2020-10-23 10:44:57 · 1290 阅读 · 0 评论 -
HashMap源码解读
static class Entry<K, V> implements Map.Entry<K,V>{ final K key; V value; Entry<K, V> next; int hash;}构造方法HashMap<K, V>while循环,确保最终数组的长度一定为2^npublic V put(K key, V value)hashMap可以放key为空的值,hashTable不能放key为空的值fi...原创 2020-10-19 17:23:43 · 149 阅读 · 0 评论 -
JAVA开发面试_Mysql篇
事务4大特性?这4个特性mysql如何保证实现的?事务4大特性:原子性、一致性、隔离性、持久性 原⼦性: 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么全不执行 一致性: 执⾏事务前后,数据保持⼀致,多个事务对同⼀个数据读取的结果是相同的; 隔离性: 并发访问数据库时,⼀个⽤户的事务不被其他事务所⼲扰,各并发事务之间数据库是独⽴的; 持久性: ⼀个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发⽣故障也不应该对其有任何影响。实现保证(bi原创 2020-10-17 12:15:59 · 651 阅读 · 1 评论 -
Java开发面试_多线程并发篇
目录进程线程区别,线程安全和非线程安全区别线程状态,start,run,wait,notify,yiled,sleep,join等方法的作用以及区别wait,notify,notifyAll阻塞唤醒确切过程?守护线程,线程中断Java乐观锁机制,CAS思想?缺点?是否原子性?如何保证?synchronized使用方法?底层实现?ReenTrantLock使用方法?底层实现?和synchronized区别?公平锁和非公平锁区别?为什么公平锁效率低?锁优化。自旋锁、自适应自旋原创 2020-10-16 17:47:05 · 454 阅读 · 0 评论