JavaSE
XiangYida
这个作者很懒,什么都没留下…
展开
-
BufferedReader.read()
BufferedReader.read()BufferedReader reader=new BufferedReader(new InputStreamReader(System.in)); System.out.println(reader.read());今天在用这个方法的时候看到返回的类型正好的int,然后直接用来读取int结果导致后面出现了莫名其妙的错误仔细看了...原创 2018-11-15 16:31:35 · 2903 阅读 · 0 评论 -
深入理解NoClassDeFoundError与ClassNotFoundException
1.先看一下两个类的继承结构图NoClassDeFoundErrorClassNotFoundException通过对比这两张图就会发现他们的区别在于,一个继承自Exception,另一个继承自Error这里就涉及到Exception与Error的区别了。Exception属于CheckedException错误,就是程序能捕获处理的错误。而Error属于UnChecke...原创 2019-04-06 11:14:20 · 9074 阅读 · 1 评论 -
HashMap的四种遍历方式
HashMap的四种遍历方式public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); map.put("key1", "value1"); map.put("key2", "value2");...原创 2019-04-06 19:10:40 · 188 阅读 · 0 评论 -
Java多线程-创建线程的三种方式
1.Java创建线程的三种方式package file;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * @author XiangYida * @version 2019/...原创 2019-04-06 19:28:16 · 277 阅读 · 0 评论 -
Java-重写方法返回类型问题
重写方法返回类型问题关注两个问题1、参数类型是否可变2、返回类型是否可变class A{ public A Hello(A a) { return a; }}class B extends A{}class C extends A{ @Override public A Hello(A a) { return ne...原创 2019-04-07 10:18:11 · 3531 阅读 · 0 评论 -
浅析ConcurrentHashMap(JDK1.8)
1、前言我们都知道HashMap是线程不安全的,主要体现在put和resize的时候。使HashMap安全,经历了HashTable,Jdk1.7 ConcurrentHashMap和Jdk1.8的ConcurrentHashMap。那么他们的区别在哪里呢?HashTable:在通过使用大量的synchronized来保证线程的同步,但这样就造成了并发低,且线程上下文的切换导致性能不太高...原创 2019-04-20 22:01:35 · 177 阅读 · 0 评论 -
Java多线程-CAS操作
Java中的CAS操作CAS 即Compare and Swap,其是JDK 提供的非阻塞原子性操作,它通过硬件保证了比较更新操作的原子性。JDK 里面的Unsafe 类提供了一系列的compareAndSwap。boolean compareAndSwapLong(Object obj ,long valueOffset,long expect, long update)CAS有四个操作...原创 2019-04-20 23:14:47 · 140 阅读 · 0 评论 -
Java多线程-锁的优化
1.适应性自旋2.锁消除3.锁粗化4.轻量级锁5.偏向锁1.适应性自旋自旋锁:互斥同步对象能最大的影响就是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能你带来了很大很大的压力,虚拟机开发团队注意到,大部分应用共享数据状态只会持续很短的一段时间,为了这段时间去挂起和恢复线程并不值得。所以自旋锁就是线程获取锁失败,不会进入阻塞...原创 2019-04-28 15:16:31 · 207 阅读 · 0 评论 -
Java多线程-ThreadLocal
ThreadLocalThreadLocal 是JDK 包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal 变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。创建一个ThreadLocal 变量后,每个线程都会复制一个变量到自己的本地内存。public void set(...原创 2019-04-19 17:23:04 · 110 阅读 · 0 评论 -
Java多线程-synchronized关键字
以下内容摘自《Java并发编程之美》翟陆续感谢作者这本书写得真棒。解决了我很多困惑,有机会一定要认真读一读1.synchronized关键字synchronized块是Java 提供的一种原子性内置锁,Java中的每个对象都可以把它当作一个同步锁来使用, 这些Java 内置的使用者看不到的锁被称为内部锁,也叫作监视器锁。线程的执行代码在进入synchronized 代码块前会自动获取...原创 2019-03-21 20:42:18 · 206 阅读 · 0 评论 -
Java多线程-并发中的各种锁
1.乐观锁与悲观锁悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock...原创 2019-03-21 20:07:10 · 257 阅读 · 0 评论 -
Java多线程-volatile关键字
synchronized使用锁太笨重,因为它会带来线程上下文的切换开销。对于解决内存可见性问题, Java 还提供了一种弱形式的同步,也就是使用volatile 关键字。该关键字可以确保对一个变量的更新对其他线程马上可见。当一个变量被声明为volatile时,线程在写入变量时不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存。当其他线程读取该共享变量时,会从主内存重新获取最新值,而不是使用...原创 2019-03-21 19:12:34 · 126 阅读 · 0 评论 -
ArrayList源码分析
ArrayList1.时间复杂度add(Object obj) , get(int index),set(int index)为O(1)add(Object obj,int index) , remove(int index) O(n)(特殊情况,如果remove是最后一个元素则时间复杂度为O(1)原因:添加,删除都涉及到数组拷贝 关键源码:public void add...原创 2019-03-06 21:53:35 · 416 阅读 · 0 评论 -
Java多线程-线程池
线程池以下整理自 http://www.cnblogs.com/dolphin0520/p/3932921.html (万分感谢)1.ThreadPoolExecutor类ava.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecuto...原创 2019-03-10 11:15:31 · 128 阅读 · 0 评论 -
LinkedList源码分析
1.时间复杂度get() 获取第几个元素,依次遍历,复杂度O(n)add(E) 添加到末尾,复杂度O(1)add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n)remove()删除元素,直接指针指向操作,复杂度O(1)transient Node<E> first;//指向第一个节点transient Node<E>...原创 2019-03-10 11:17:30 · 103 阅读 · 0 评论 -
Java多线程-线程状态以及常用方法
1、线程状态转换1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。...原创 2019-03-20 19:18:43 · 219 阅读 · 0 评论 -
Java多线程-wait()与sleep()的区别
1. wait()当一个线程调用一个共享变量的wait()方法时,该调用线程挂起,并释放通过同步块获取的上的锁.直到发生下面几件事情之一才返回:其他线程调用了该共享对象的notify()或者notifyAll()方法;其他线程调用了该线程的interrupt()方法,该线程抛出InterruptedExce ption 异常返回。获取队列里面的元素另外需要注意的是,如果调用wa...原创 2019-03-20 21:55:59 · 144 阅读 · 0 评论 -
HashMap源码分析
HashMapJDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间。JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过...原创 2019-03-17 11:00:16 · 123 阅读 · 0 评论 -
Java多线程-生产者消费者模式
1、使用synchronized,wait(),notify()商品package test;public class Goods { public int number; public Goods(int number) { this.number = number; } //生产 synchronized public voi...原创 2019-03-21 16:13:43 · 129 阅读 · 0 评论 -
Java多线程-守护线程与用户线程
Java 中的线程分为两类,分别为daemon 线程(守护线程)和user 线程(用户线程)。在JVM启动时会调用main函数,main 函数所在的钱程就是一个用户线程,其实在JVM内部同时-还启动了好多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别呢?区别之一是当最后一个非守护线程结束时,JVM 会正常退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM的退出。言...原创 2019-03-21 17:03:03 · 144 阅读 · 0 评论 -
Java线程调度
1.Java线程的实现JDK1.2之前JDK1.2之后用户线程的实现基于操作系统原生线程所以,在JDK1.2之后操作系统支持怎样的线程模型决定了Java虚拟机的线程是怎样映射的。2.Java线程调度两种调度方式:协同式调度抢占试调度2.1协同式调度线程执行时间由线程本身控制,线程把自己的工作执行完了之后,要通知系统切换到另一个线程上。优点缺...原创 2019-08-14 00:50:00 · 162 阅读 · 0 评论