随笔分类 -  java

java
摘要:AQS是一个实现阻塞式锁的框架,ReentrantLock锁就是基于AQS实现的阻塞式锁。 AQS的原理: (1)在AQS内部维护了一个用volatile修饰的state属性用来表示资源的状态,0表示无锁,1表示有锁。类似于monitor的owner属性。 (2)在AQS内部提供了一个FIFO的双向 阅读全文
posted @ 2023-05-28 22:09 程序员_YHB 阅读(64) 评论(0) 推荐(0)
摘要:volatile保证了线程之间的可见性。即某个线程修改了一个共享变量,这个变量立刻对所有线程可见。 volatile保证了指令重排序:用volatile修饰的共享变量在读、写时会加入一个内存屏障,保证了指令重排序。 volatile可以保证可见性、有序性,但是不能保证原子性。 阅读全文
posted @ 2023-05-28 21:57 程序员_YHB 阅读(23) 评论(0) 推荐(0)
摘要:CAS即比较并交换,是一种非阻塞式锁,也称为乐观锁,在无锁的情况下保证线程操作共享资源的原子性。 工作原理:采用CAS的方式修改共享资源时会读取共享资源作为一个预期值,在进行比较,如果预期值和当前值一样,那么就会更新成功,如果不一样,会采用自旋的方式再次获取共享资源的值尝试完成更新,当自旋次数达到一 阅读全文
posted @ 2023-05-28 21:50 程序员_YHB 阅读(179) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2023-05-28 21:35 程序员_YHB 阅读(30) 评论(0) 推荐(0)
摘要:JDK1.6时synchronized锁有: 偏向锁:在一段时间只有一个线程使用锁,此时就可以使用偏向锁,第一次获取到锁需要CAS操作,之后要再次获取锁,只需要在获取锁时判断当前线程id是否为已经获取锁的线程id,不需要CAS操作,提高了性能。 轻量级锁:多个线程交替持有锁,但是没有发生竞争,此时就 阅读全文
posted @ 2023-05-28 21:31 程序员_YHB 阅读(29) 评论(0) 推荐(0)
摘要:synchronized对象锁采用互斥的方式使得在同一时刻只有一个线程能够持有锁并操作共享资源,如果其它线程想要获取锁就会进入阻塞状态,从而保证了线程安全问题。 synchronized底层原理:synchronized的实现基于JVM的锁监视器(monitor),每个JVM都有维护自己的一套锁监视 阅读全文
posted @ 2023-05-28 21:16 程序员_YHB 阅读(71) 评论(0) 推荐(0)
摘要:(1)使用退出标志,让run()方法运行结束,线程正常停止。 (2)调用stop()方法强行终止线程,不建议使用该方法,容易产生死锁。 (3)使用interrupt方法中断线程。 阅读全文
posted @ 2023-05-28 16:36 程序员_YHB 阅读(94) 评论(0) 推荐(0)
摘要:(1)wait()方法是object类的方法,sleep是Thread类的静态方法。 (2)wait()方法需要和锁搭配使用,线程调用wait()方法会释放锁,而sleep()方法不需要和锁搭配使用,线程调用sleep()方法不会释放锁。 (3)线程调用wait()方法需要其它线程调用notify( 阅读全文
posted @ 2023-05-28 16:33 程序员_YHB 阅读(14) 评论(0) 推荐(0)
摘要:notify()方法随机唤醒一个处于等待的线程。 notifyAll()方法唤醒所有处于等待的线程。 阅读全文
posted @ 2023-05-28 16:29 程序员_YHB 阅读(20) 评论(0) 推荐(0)
摘要:在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在 一个线程中启动另一个线程,另外一个线程完成该线程继续执行。 阅读全文
posted @ 2023-05-28 16:26 程序员_YHB 阅读(29) 评论(0) 推荐(0)
摘要:线程有六种状态: 新建:当线程被创建时,还没有调用start()方法。 可运行:调用start()方法后,等待CPU调度。 阻塞:线程没有获取到锁进入阻塞状态。 等待:线程获取到锁之后由于条件不满足调用wait()方法后释放锁进入等待状态,当其它持有锁的线程调用notify()或者notifyAll 阅读全文
posted @ 2023-05-28 16:22 程序员_YHB 阅读(63) 评论(0) 推荐(0)
摘要:创建线程有四种方式: (1)继承Thread类重写run()方法,调用start()方法启动线程。 (2)实现Runable接口,实现run()方法。 (3)实现Callable接口,实现call()方法。 (4)线程池创建线程。 为什么要使用线程池:减少线程的上下文切换带来的损耗、减少创建线程和销 阅读全文
posted @ 2023-05-28 16:10 程序员_YHB 阅读(78) 评论(0) 推荐(0)
摘要:并发:两个或多个线程轮流使用CPU资源。 并行:多个核同时调度线程执行任务,这个时候就是并行。 阅读全文
posted @ 2023-05-28 15:50 程序员_YHB 阅读(31) 评论(0) 推荐(0)
摘要:(1)进程是操作系统分配资源的基本单位。线程是CPU任务调度的基本单位。 (2)一个进程可以包含多个线程,进程内的线程共享进程内的资源。 (3)进程和进程之间的内存和资源相互隔离。 阅读全文
posted @ 2023-05-28 15:45 程序员_YHB 阅读(35) 评论(0) 推荐(0)
摘要:强引用:普通对象的强引用关系。如:直接的赋值语句:String str=new String(“string”);强引用不会被垃圾回收。 软应用:当内存不足时,具有软引用关系的对象会被垃圾回收。 弱引用:不管内存足不足,都会被垃圾回收。 虚引用:虚引用通常配合引用队列来使用,用于跟踪对象被垃圾回收的 阅读全文
posted @ 2023-05-27 15:14 程序员_YHB 阅读(176) 评论(0) 推荐(0)
摘要:JVM有四种垃圾回收器: (1)串行垃圾回收器:采用单线程进行垃圾回收,占用内存比较小,适合个人电脑使用。 serial垃圾回收器:用于新生代垃圾回收,采用标记复制算法。 serial Old垃圾回收器:用于老年代垃圾回收,采用标记整理算法。 缺点:垃圾回收时只有一个线程在工作,其它java应用的线 阅读全文
posted @ 2023-05-27 14:51 程序员_YHB 阅读(147) 评论(0) 推荐(0)
摘要:判断一个对象是否存活的方法: (1)引用计数法:给每个对象设置一个引用计数器,对象被引用时就+1,引用失效时就-1,当对象的引用为0时,该对象就被视为垃圾对象,等待垃圾回收。但是该方法不能解决循环引用问题。例如:A引用B,B应用A。现在的虚拟机一般不用这种方法。 (2)可达性分析法:沿着GC Roo 阅读全文
posted @ 2023-05-27 13:54 程序员_YHB 阅读(28) 评论(0) 推荐(0)
摘要:类加载:把类的数据加载到内存,并对数据进行校验、解析、初始化,最终形成可以被虚拟机直接使用的class对象。 类加载机制:类加载采用双亲委派机制。 双亲委派机制:当类加载器收到类加载请求时,它不会第一时间去加载这个类,而是由父类加载器去加载,如果父类加载器加载不到这个类,才由子类加载器加载。 双亲委 阅读全文
posted @ 2023-05-26 14:00 程序员_YHB 阅读(71) 评论(0) 推荐(0)