![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础
文章平均质量分 78
yfyh2021
这个作者很懒,什么都没留下…
展开
-
JVM整体结构
由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。-Xms:设置堆的初始可用大小,默认物理内存的1/64。-Xmn:新生代大小。原创 2022-09-30 15:52:37 · 625 阅读 · 0 评论 -
JVM类加载及双亲委派机制
概念:加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。//初始化自定义类加载器,会先初始化父类ClassLoader,其中会把自定义类加载器的父加载器设置为应用程序类加载器AppClassLoader。= null) { //如果当前加载器父加载器不为空则委托父加载器加载该类。} else { //如果当前加载器父加载器为空则委托引导类加载器加载该类。类加载的过程主要又类加载器完成。原创 2022-09-21 16:58:26 · 298 阅读 · 0 评论 -
网络通信编程基础,BIO,NIO
SelectionKey是一个抽象类,表示selectableChannel在Selector中注册的标识,其中有四种状态分别是OP_READ(读事件),OP_WRITE(写事件),OP_CONNECT(发起连接事件),OP_ACCEPT(接收连接事件)jvm在向socket缓冲区发送信息时,会在堆外重新开辟一块内存,将要发送的信息拷贝进去。这样做的原因是防止在gc的时候,改变堆内信息的位置。1减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作(可能使用多线程或者时间片的方式,根本感觉不到)......原创 2022-07-29 11:37:53 · 124 阅读 · 0 评论 -
网络通信编程基础,BIO,NIO
SelectionKey是一个抽象类,表示selectableChannel在Selector中注册的标识,其中有四种状态分别是OP_READ(读事件),OP_WRITE(写事件),OP_CONNECT(发起连接事件),OP_ACCEPT(接收连接事件)这样做的原因是防止在gc的时候,改变堆内信息的位置。1减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作(可能使用多线程或者时间片的方式,根本感觉不到)在连接建立之后,在读到socket信息之前,线程也是一直在等待的,阻塞在那里。堆外内存的优点和缺点。...原创 2022-07-29 11:36:48 · 110 阅读 · 0 评论 -
网络通信及TCP/IP协议
新入职员工加入公司网络,他会通过ARP协议(数据链路层)进行广播,公司的DHCP服务器收到广播后会根据新员工的MAC地址分配IP。●数据报(datagram)IP中数据的单位。TCP是双全工(即客户端和服务端可以同时发送和接收请求),所以需要双方都确认关闭连接。●报文段(segment)TCP数据流中的信息,报文加上tcp包首部(20字节)●报文/消息(message)应用层传到传输层(tcp)的数据。●帧(frame)表示数据链路层中包的单位。TCP/IP中的数据术语。...原创 2022-07-26 14:47:46 · 585 阅读 · 0 评论 -
AQS之CyclicBarrier源码解析
我们在前面的reentrantlock,semaphore和countDownLatch中都能看到AQS的addWaiter()方法,是构建同步等待队列的双向链表的。first变为thread1所在的node节点,再次循环进入transferForSignal()方法,将thread1所在的node入队同步队列。我们看到先是通过cas操作将node(thread0)节点的waitStatus又-2变为0,然后看到了我们熟悉的enq()方法可知道,此时同步队列已经构建完成,thread0所在的节点入队。...原创 2022-07-15 17:34:24 · 283 阅读 · 0 评论 -
AQS之countDownLatch源码分析
CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。 进入await()方法发现acquireSharedInterruptibly()方法是传入固定参数1。 又是AQS这块熟悉的代码,先是try尝试,然后是do进行一些列入队和阻塞操作。从这个方法我们可以看到countDownLatch是共享锁。 闭锁的try方法相当简单,其state为我们创建闭锁时传入的值。返回-1,进入我们原创 2022-07-14 15:04:43 · 126 阅读 · 0 评论 -
AQS之semaphore源码分析
一个简单的买票逻辑模拟。我们还是按照分析reentrantlock的debug方式来分析代码。 我们还是首先控制thread0进入上锁acquire()方法,传入的arg参数为1,进入tryAcquireShared(arg)方法 进入nonfairTryAcquireShared(int acquires)方法,此时,AQS中控制状态的state属性就是我们创建semaphore时初始化的数值(在非共享锁中,我们知道AQS的state为0时就需要阻塞线程了),最后返回rema原创 2022-07-13 16:48:41 · 112 阅读 · 0 评论 -
AQS之ReentrantLock源码解析
ReentrantLock加锁解锁的逻辑。公平和非公平,可重入锁的实现。并发场景下入队和出队的操作。一个简单的代码,我们打上断点,选择线程的模式,来看看线程内部是如何执行的。 两行代码。compareAndSetState(0, 1)通过cas运算将锁状态由0改为1setExclusiveOwnerThread(Thread.currentThread()) 将锁绑定到该线程,上锁完成。 通过上面两行逻辑完成上锁。此时thread0以执行完成,sum值为10000,但是暂未释放锁。我们原创 2022-06-23 18:22:06 · 107 阅读 · 0 评论 -
JDK8新特性
1.Lambda表达式lambda表达式本质上是一段匿名内部类,也可以是一段可以传递的代码1.1语法(Type1param1,Type2param2,...,TypeNparamN)‐>{statment1;statment2;//.............returnstatmentM;}a.绝大多数情况,编译器都可以从上下文环境中推断出lambda表达式的参数类型,所以参数可以省略:(param1,param2,...,paramN)‐>...原创 2021-09-12 15:15:58 · 63 阅读 · 0 评论 -
callable接口
实现线程的方法继承Thread类和实现Runnable接口都有没有返回值的局限性,如果想要创建一个带返回值的线程则需要实现runnable接口,这时候启动线程则不能用start方法了,需要使用线程池进行启动线程。代码如下:class HandleCallable implements Callable<Integer>{ private String name; public HandleCallable(String name){ this.nam原创 2021-08-27 15:51:00 · 88 阅读 · 0 评论 -
线程的等待、唤醒机制
话不多说,先上代码public class Demo { public static void main(String[] args) { final Object lock = new Object(); new Thread(new Runnable() { public void run() { synchronized (lock){ System.out.p原创 2021-08-27 15:06:14 · 158 阅读 · 0 评论 -
实现线程锁的三种常用方式
先举个经典的例子说明线程安全问题:三个窗口卖100张票class TicketThread implements Runnable{ private int total=100; public void run() { while (true){ if(total>0){ try { Thread.sleep(100); } catch (原创 2021-08-26 22:09:41 · 7140 阅读 · 0 评论 -
线程的几种常用方法和与之对应的状态
一.线程的常用方法1.线程的优先级Thread thread = new Thread(myRunnable);thread.setPriority(Thread.MAX_PRIORITY);//线程的优先级MAX_PRIORITY优先级高,MIN的优先级低2.睡眠当前线程class MyRunnable implements Runnable{ public void run() { for(int i=0;i<10;i++){原创 2021-08-26 20:03:32 · 95 阅读 · 0 评论 -
创建线程的两种方法
1.继承thread类继承thread类,重新run方法,new thread的子类,startclass MyThread extends Thread{ public void run(){ for(int i=0;i<10;i++){ System.out.println("新开的线程"+i); } }}public class Demo1 { public static void main(Stri原创 2021-08-26 15:28:54 · 59 阅读 · 0 评论