![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
廖雪峰Java学习笔记
文章平均质量分 60
Cigar丶
这个作者很懒,什么都没留下…
展开
-
廖雪峰Java学习笔记 — 悲观锁与乐观锁、线程安全集合
1. ReadWriteLock前面说到,ReentrantLock可以替代synchronized实现线程同步,方便我们进行多线程开发。但是在有些场景下ReentrantLock效率比较低,比如论坛上,大多数人都只是阅读(读),发论坛(写)几率比较小。如果使用ReentrantLock,那么一个用户在读的时候,对象就被锁住了,暂时不再允许其他用户读,这样在读的请求量非常高的情形下,效率比较低。ReadWriteLock允许多个线程在没有写入时同时读取(提高性能),但只允许一个线程写入。示例代码如下原创 2021-03-02 19:20:53 · 242 阅读 · 0 评论 -
廖雪峰Java学习笔记 — 线程协调与ReentrantLock
1. 线程协调前面说到可以使用synchronized关键字来解决线程同步(资源竞争)的问题。但有时线程间还需要协调运行,比如一个线程负责将接收到的任务送入队列,一个线程负责取出队列中的任务,如下:class TaskQueue { private final Queue<String> taskQueue = new LinkedList<>(); public synchronized void addTask(String task) {原创 2021-03-01 18:41:14 · 134 阅读 · 0 评论 -
廖雪峰Java学习笔记 — 线程同步与死锁
1. 线程同步当多个线程同时运行时,线程的调度由操作系统决定,程序本身无法决定。所以当多个线程任务读写同一变量时,会产生数据不一致的情况。为了解决这个问题,就需要在线程中对该变量进行加锁与解锁来保证数据的一致性。Java程序使用synchronized关键字对一个对象进行加锁:synchronized(lock) { n = n + 1;}注意必须是对同一个对象进行加锁,此外,Java中规定了如下几个原子操作:基本类型的赋值,例如int a = b;引用类型赋值。如果方法中原创 2021-03-01 14:57:33 · 174 阅读 · 2 评论 -
廖雪峰Java学习笔记 — 中断线程与守护线程
1. 中断线程有时线程需要执行长时间的任务,比如下载一个1GB的大文件,但或许由于网速过慢,导致用户点击取消下载,这时就需要中断这个线程。在Java中,只需要在其他线程中对目标线程调用interrupt()方法,然后目标线程反复检测自身状态是否为interrupt状态,如果是,就立即结束。示例代码:public class Main { public static void main(String[] args) throws InterruptedException { T原创 2021-01-20 17:13:00 · 201 阅读 · 0 评论 -
廖雪峰Java学习笔记 — 多线程1
1. 多线程基础操作系统对CPU采用时间切片的方式轮流让多个任务交替运行,由于每个片的时间很短,所以在人看来,CPU就是在同时进行多个任务。上述中的一个任务实际上就是一个进程,但有时某些进程还需要执行多个子任务,比如在网络编程中,服务器的套接字等待接收客户端的数据时,还要处理其他逻辑,这里的子任务称为线程。一个进程可以包含多个线程,但至少包含一个主线程。一个Java程序实际上就是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法中,又可以创建多个线程。由于Java具有垃原创 2021-01-18 14:24:31 · 151 阅读 · 0 评论 -
廖雪峰Java学习笔记 — 包装类与JavaBean
1. 自动装箱与拆箱基本类型与包装类直接可以互相转换。int i = 100;Integer n = Integer.valueOf(i);int x = n.intValue();有时,这样可能还会觉得比较麻烦,所以Java编译器为我们提供了自动装箱与自动拆箱。Integer n = 100; // 自动装箱int x = n; // 自动拆箱注意,自动装箱和自动拆箱仅在编译期间就完成,编译器会自动帮我们替换,虚拟机看到如下:Integer n = Integer.valueOf原创 2021-01-05 22:00:54 · 209 阅读 · 2 评论 -
廖雪峰Java学习笔记 — 内部类
1. 内部类在Java中有一种类,被定义在一个类的内部,它被称为内部类(Nested Class)。Java中常见的内部类有三种,Inner Class,Anonymous Class,Static Nested Class。2. Inner Class有如下代码public class Main { public static void main(String[] args) { Outer outer = new Outer("Nested"); // 实例化一个Ou原创 2021-01-05 21:59:34 · 128 阅读 · 0 评论 -
抽象类与接口的联系
1. 抽象类和接口的区别类可以实现无限个接口,但只能从一个抽象类继承。抽象类中可以存在并实现非抽象方法,但接口里面的方法只能是public且没有实现的。抽象类的成员变量可以被不同的修饰符来修饰,但接口的成员变量只能是静态常量(static final)。抽象类是对象的抽象,接口是一种行为规范。2. 抽象类和接口的使用注意事项在继承抽象类时,必须要实现抽象类中所有的抽象方法,且实现的方法必须与抽象方法签名完全一致,这和接口一致。抽象类的非抽象方法具有实际功能时,子类可以不必重写该方法,可转载 2020-12-23 21:40:24 · 168 阅读 · 0 评论 -
廖雪峰Java学习笔记 — 继承与多态
1. 继承1.1 super的用法在Java中,任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super()。下面代码定义了人和学生类的继承关系:class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age;原创 2021-01-05 21:57:13 · 135 阅读 · 4 评论 -
廖雪峰Java学习笔记 — Java异常
1. 异常继承关系从图中可以看出,Throwable是所有异常的根,异常分为如下两大类:Error,比较严重的异常,程序一般对此无力,比如:OutOfMemoryError:内存耗尽。StackOverflowError:栈溢出。Exception,是运行时错误,可以被捕获并处理,Exception分为如下两类:RuntimeException及其子类:通常是逻辑代码编程不对造成的,例如NullPointerException ,IndexOutOfBoundsExcepti原创 2021-01-05 21:53:15 · 106 阅读 · 0 评论 -
廖雪峰Java学习笔记 — Java日志
1. JDK Logging在调试时,反复增删System.out.println()非常麻烦,日志的目的是为了取代System.out.println()。相比System.out.println(),日志多了一些功能:可以设置输出样式。可以设置输出级别。可以重定向至文件。…在Java标准库中内置了java.util.logging包,但通常一般不用JDK自带的日志包,如下两个日志搭配方案比较流行。Commons Logging和Log4j。SLF4J和Logback。2.原创 2021-01-05 21:47:31 · 172 阅读 · 0 评论