logo
publist
写文章

简介

该用户还未填写简介

擅长的技术栈

可提供的服务

暂无可提供的服务

Java-双向链表的底层实现

3.处理措施:我们先正常 head = head.next,此时 head = null,而单向链表中head = last,但是我们要指出来,last = null,这样我们就成功处理好了单节点的情况。2.头节点不为空,我们让node节点的next指向原来的头节点head,让原来head的prev里面的null指向这个新的头节点node,最后定义head = node(让node成为新的头节点)

#java#链表#开发语言
Java-二叉树的底层实现1

思路:层序遍历是一种自上而下,从左到右的打印,所以我们需要借助队列的先进先出的特性,先offer一个根节点,然后将这个根节点cur,poll吐出来并打印的同时检查其是否有左右孩子,如果有,则queue继续offer,cur的左右孩子进来,不断循环,直到队列为空。·简单来说,二叉树就是带两个分支的链表,每个节点里存着一个数据,而每个节点又有两个用引用串联起来的子节点(左孩子和右孩子),孩子里面也同样

#算法#数据结构
深入理解Java并发:线程安全问题的根源与解决方案

每个线程都有一个自己的“工作内存(其实指的是CPU的寄存器)”,同时这些线程共享同一个主内存,当一个线程循环进行上述读取操作的时候,就会被主内存中的数据拷贝到该线程的“工作内存”(寄存器)上,后续别的线程修改,也是修改自己的工作内存,拷贝到主内存中,由于第一个线程任然在读自己的工作内存,因此感知不到主内存的变化。在t2线程完整完成两次++操作后,内存中count此时为2,但t1线程一开始读的cou

文章图片
#java#开发语言#安全
Java并发编程:彻底搞懂单例模式中的安全隐患

这时候在多线程环境下,线程A(施工队准备装修房子,也就是准备初始化完善功能),在132的情况下,线程A因为指令重排序问题,在还没装修房子的情况下就把钥匙交出去了,就在这一时刻,刚好线程B也在调用getInstance方法,成功拿到了钥匙,但一进房子,发现房子根本没装修,根本没法住!·内存可见性问题:假设这里有两个线程,同时调用getInstance方法,虽然我们说只“读”这一操作不会导致线程安全问

文章图片
#java#单例模式#开发语言 +1
Java线程池八股文:七大参数、执行原理与避坑指南

我们假设一个点有两种表示方式,一个是普通的 xy 坐标表达式,一个是通过 半径r 和 角度a 的坐标表达式,但我们在创建Point这个类,我们发现构造方式只有一个,也就是只能通过一种方式来表达这个点,这里就可以引出我们的工厂设计模式(通过不同的静态方法实现不同的表达式创建对象)我们通常认为,可控的过程要比不可控的过程更高效,所以说如果有一段代码,需要进入到内核中,由内核负责完成一系列工作,这个过程

文章图片
#java#开发语言
Java-非递归实现前中后序遍历

联想一下,我们在递归实现中序遍历时,路上碰到某个节点,要先检查这个节点的左是否为空,如果为空才能打印这个节点的值,如果不为空,则继续向left走,当无法向left走时,说明这个节点已经没有左孩子了,此时该节点符合我们中序遍历的打印条件,当无法向left走时,此时转而去检查遍历该节点的右子树,依旧同样的规则。再次联想递归实现时的思路,我们在一路往left的时候,碰到节点,需要检查该节点是否左右孩子都

#java#开发语言
Java线程的六大状态

我们设计start后,先让主线程睡一秒,再观察t1线程的状态,如果不睡这一秒,主线程会在t1.start之后迅速观察并打印t1线程的状态,t1线程此时的状态大概率还未第一次执行到sleep,所以我们很可能会观察到RUNNABLE,所以我们设计先睡上这一秒以便我们观察。大多数人都能脱口而出‘新建,运行,阻塞,死亡’,但这其实是操作系统的线程状态,而不是Java语言层面的答案,在Java对于线程引用提

#java#开发语言
以“轮盘数组”思维彻底搞懂并实现阻塞队列

我们的wait等待不是一定只能有notify唤醒,还可能被Interrupt这样的方法给中断,如果使用if作为wait的判定条件,此时就存在wait被提前唤醒的风险,导致队列明明是(空/满),但我们还是执行了(put/take)方法,这会导致一些安全问题。由于接下来的put和take方法都会涉及到改,而改则会在多线程环境下产生线程安全问题,所以我们一定要记得加锁,这里我们以this作为锁。阻塞队列

文章图片
#java#服务器#安全 +1
Java线程的六大状态

我们设计start后,先让主线程睡一秒,再观察t1线程的状态,如果不睡这一秒,主线程会在t1.start之后迅速观察并打印t1线程的状态,t1线程此时的状态大概率还未第一次执行到sleep,所以我们很可能会观察到RUNNABLE,所以我们设计先睡上这一秒以便我们观察。大多数人都能脱口而出‘新建,运行,阻塞,死亡’,但这其实是操作系统的线程状态,而不是Java语言层面的答案,在Java对于线程引用提

#java#开发语言
到底了