Java基础
三十岁“开始”学Java
不是因为看到希望才去坚持,而是因为坚持才看到希望
展开
-
高并发场景下ArrayList的线程安全问题
ArrayList是我们常用的数据结构,在并发场景下是线程不安全的。 在读多写少的场景下,我们一般会用读写锁 ReadWriteLock来保证共享对象的线程安全性。 public Object read() { lock.readLock().lock(); // 对ArrayList读取 lock.readLock().unlock(); } public void write()...原创 2019-10-14 08:59:04 · 1217 阅读 · 0 评论 -
红黑树与平衡二叉树
AVL树:严格的平衡二叉树 红黑树:弱的平衡二叉树(在相同的节点情况下,AVL树的高度低于红黑树) 平衡条件必须满足(所有节点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而它的英文旋转非常耗时的,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况 适用情况: AVL树:插入与删除次数比较少,但查找多的情况 红黑...原创 2019-10-10 18:22:06 · 120 阅读 · 0 评论 -
Java垃圾回收机制(GC策略)
万雨 嘿嘿,又获得了新的知识 (づ。◕ᴗᴗ◕。)づ 随笔 - 131, 文章 - 3, 评论 - 29, 引用 - 0 Java垃圾回收机制(GC策略) Java垃圾回收机制(GC策略) 核心:1,哪些是垃圾?【怎么确定这个是垃圾】;2,如何回收垃圾?【怎么更好收垃圾】。 Java语言相对于C++等语言有一个自动垃圾回收机制,只用管使用【实例化对象】,后续的垃圾回收有专门的...转载 2019-10-07 22:30:39 · 334 阅读 · 0 评论 -
jvm调优的一些思考
JVM垃圾回收需要考虑的两个点:停顿时间短、高吞吐量。 不同的要求,不同的收集模式(收集过程)。 如何保证垃圾收集准确,速率高,线程数多少,占用的内存情况都需要考虑。 为什么需要stw(stop the world)? jvm GC优化: 硬件配置 业务场景(吞吐量,延迟,内存使用) 串行收集: 串行垃圾收集器有: Serial收集器\Serial Old收集...原创 2019-10-07 12:27:26 · 113 阅读 · 0 评论 -
简单区别select poll epoll
select 创建的连接数最大1024;poll没有限制 select和poll采用 轮询的方式,去处理连接的channelList; epoll通过内核的通知机制,通过回调通知channel。 轮询方式:如果客户端请求只有一个发生io操作,这时候也需要遍历其他所有的channel,判断是否发生io操作。 回调方式:只有发生了io操作的,才会通知回调。 两种方式的比较: 如果并发大力...原创 2019-10-06 18:00:54 · 121 阅读 · 0 评论 -
jvm-gc什么时候会触发
1.问:minor gc什么时候被触发? 触发minor gc的关键在于:eden区内存不足。造成eden区内存不足的原因:由于java对象大部分都是朝生夕死(java局部对象),而死掉的对象就需要在合适的时机被jvm回收,这里就涉及到根搜索算法,java对象的关联关系其实就是一个树形结构,从根到叶子节点遍历,死掉的对象也就和根断开了连接关系, 没有死掉的对象也会由于minor gc被强制断开关系...转载 2019-10-05 09:40:40 · 3923 阅读 · 0 评论 -
jvm-jvm垃圾回收
最近学习jvm,一点理解,希望和大家一起分享,不对的地方,大家共同讨论。 写在前面的话,很重要。jvm不仅仅是垃圾回收,还有很多别的事,如类加载、对接操作系统等。这里我们说jvm的垃圾回收。 为什么要垃圾回收?因为我们每台物理机的内存是有限固定的,我们的应用程序只要在运行就会不断生成新的对象。这时候如果需要保证服务器能继续工作,就必须去进行对象的回收。JVM这里帮我们进行了回收,回收垃圾的时候...原创 2019-10-07 12:28:08 · 88 阅读 · 0 评论 -
jvm-jvm垃圾回收过程
面试管问:来说一下回收的过程? 参考:https://www.cnblogs.com/bonelee/p/8066990.html 几个名词: 年轻代(Young Generation) 年老代(Old Generation) 永久代(Permanent Generation,也就是方法区),jdk1.8之后,叫做元空间,将原来分配给方法区内存,直接交由物理磁盘来处理。 m...转载 2019-10-05 08:29:10 · 107 阅读 · 0 评论 -
阻塞方法的优化
可以将阻塞调用过程交给线程处理。 如socket的读写,可以将socket交给线程处理。通过线程的run方法来处理socket的读写逻辑。原创 2019-09-25 02:55:00 · 112 阅读 · 0 评论 -
线程中断
interrupt()方法和InterruptException异常,是java专门用来处理线程阻塞的。线程阻塞,就表示要等待一段时间。如果需要等待的时间比较长,正常还没结束之前想中断某个线程的阻塞状态怎么办?这就是靠interrupt()方法来解决了。如果因为一些特殊的原因,想提前中断一些阻塞的线程,以让他们提前解除阻塞状态,然后继续执行下去。只需要在其他线程调用指定线程的interrupt()...原创 2019-09-25 02:53:18 · 89 阅读 · 0 评论 -
synchronized 和volatile
java内存模型如上图所示,每个线程都有自己独立的工作内存,当线程要访问内存中的变量时,会先将内存中的变量值复制到自己的工作内存,然后再访问;当线程要改变内存中的变量值时,也是先改变自己工作内存中副本的变量值,然后再刷新到内存中。当线程一改变了某个变量的值,而线程二想要访问该值时,可能会存在以下情况,即线程一的改变还没刷到内存,或者线程二里面缓存了老值,没有去内存中拿最新的值,这时就相当于线程...原创 2019-09-18 22:24:39 · 104 阅读 · 0 评论 -
String.intern()
/** * Returns a canonical representation for the string object. * <p> * A pool of strings, initially empty, is maintained privately by the * class {@code String}. * <...原创 2019-08-27 00:50:41 · 113 阅读 · 0 评论 -
ConcurrentHashMap原理解析
Map元素插入过程图: /** * * onlyIfAbsent 默认为false,即在key值相同的时候,用新的value值替换原始值 */ final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerEx...原创 2019-08-22 00:00:02 · 550 阅读 · 0 评论