每一个刚接触多线程并发编程的同学,当被问到,如果多个线程同时访问一段代码,发生并发的时候,应该怎么处理?我相信闪现在脑海中的第一个解决方案就是用synchronized,用锁,让这段代码同一时间只能被一个线程执行。 我们也知道,synchronized关键字可以用在方法上,也可以用在代码块上,如果要使用synchronized,我们一般就会如下使用:public synchronized void doSomething() {//do something here }或:synchonized(LockObje...
代理模式分为动态代理和静态代理,重点是动态代理 什么叫做代理? 首先要有一个接口,定义了我们的服务(标准) 然后是一个实现类(继承上面那个接口) 还有有一个代理类也会去实现这个那个接口。 然后重点: 代理就是我们不能直接去访问这个实现类,只能通过代理类去访问实现类,先说一下这个访问是通过invoke这个方法实现,参数有 实例对象、方法对象、参数列表。 大概就是下面这个样子 public Object invoke(Object proxy, Meth...
一、介绍 枚举的思想很简单,也很方便:它代表了一组固定的常量值。实际开发应用中,枚举经常用来设计一些状态常量。 比如,星期几就是枚举的一个最好例子,因为他们被限制在周一、周二、周三、周四、周五、 周六和周日。 二、枚举是一种特殊的类 在枚举被引入Java语言之前,在Java中模拟一组固定值的常规方法是通过声明一组常量。例如:public class DaysOfTheWeekConstants { ? ? public static final int MONDAY = 0; ? ? publi...
Java中的LinkedList类实现了List接口和Deque接口,是一种链表类型的数据结构,支持高效的插入和删除操作,同时也实现了Deque接口,使得LinkedList类也具有队列的特性。LinkedList类的底层实现的数据结构是一个双端的链表。 LinkedList类中有一个内部私有类Node,这个类就代表双端链表的节点Node。这个类有三个属性,分别是前驱节点,本节点的值,后继结点。 源码中的实现是这样的。private static class Node<E> {E item;Node<E> n...
这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量。那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存放数据,不同类型的数据需要放在对应类型的盒子里。那么,我们为什么要使用盒子呢?主要用于存放程序运行过程中需要临时存取和操作的数据,打个比方,我们做一顿番茄炒蛋,需要先把番茄洗一洗,然后切好放碗里,鸡蛋打好后要先放另一个碗里,然后加上料酒,加水搅拌,之后再...
Java基础1、Map、Set、List集合差别及联系详解 2、HashSet类是如何实现添加元素保证不重复的 3、HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)? 4、HashMap 的扩容过程 5、HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的? 6、final finally finalize 7、强引用 、软引用、 弱引用、虚引用 8、Java反射 Java 并发 1、synchronized 的实现原理以及锁优化? 2、volatile 的实现...
原创文章,转载请标注出处:[《Java基础系列-Comparable和Comparator》](https://www.jianshu.com/p/f9870fd05958## 一、概述 Java中的排序是由Comparable和Comparator这两个接口来提供的。 Comparable表示可被排序的,实现该接口的类的对象自动拥有排序功能。 Comparator则表示一个比较器,实现了该接口的的类的对象是一个针对目标类的对象定义的比较器,一般情况,这个比较器将作为一个参数进行传递。 二...
增加了一系列的字符串处理方法 如以下所示。 // 判断字符串是否为空白 " ".isBlank(); // true // 去除首尾空白 " Javastack ".strip(); // "Javastack" // 去除尾部空格 " Javastack ".stripTrailing(); // " Javastack" // 去除首部空格 " Javastack ".stripLeading(); // "Javastack " // 复制字符串 "Java".repeat(3);// "JavaJavaJava" // 行数统计 "A\nB\nC".lines().count(); // 3 例子: import static org.junit.Assert.*...
package AOP;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;interface Human{void info();void fly(); }class SuperMan implements Human{@Overridepublic void info() {System.out.println("我是超人");}public void fly() {System.out.println("I believe that I can fly!");} }class HumanUtil{public void method1() {System.out.println("=====方法一======...
调用指定属性package reflect;import java.lang.reflect.Field; import java.lang.reflect.Modifier;public class TestFiled {public static void main(String[] args) throws Exception {TestFiled t = new TestFiled();t.test3();}//调用运行时类中的指定的属性public void test3() throws Exception {Class clazz = Person.class;//1.获取指定的属性//getField(String fieldName):获取运行时类中声明为public的指定属性名为name...
代码示例 Person类package reflect;@MyAnnotation(value = "guozi") public class Person extends Creature<String> implements Comparable,MyInterface{public String name;private int age;public Person() {super();// TODO Auto-generated constructor stub}public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.na...
概要这一章,我们对WeakHashMap进行学习。我们先对WeakHashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用WeakHashMap。第1部分 WeakHashMap介绍第2部分 WeakHashMap数据结构第3部分 WeakHashMap源码解析(基于JDK1.6.0_45)第4部分 WeakHashMap遍历方式第5部分 WeakHashMap示例 第1部分 WeakHashMap介绍 WeakHashMap简介 WeakHashMap 继承于AbstractMap,实现了Map接口。和HashMap一样,WeakHashMap 也是一个散列表...
实现下列案例 多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。通过一定的手段使各个线程能有效的利用资源。而这种手段即—— 等待唤醒机制。如上图说示,输入线程向Resource中输入name ,sex , 输出线程从资源中输出,先要完成的任务是:当input发现Resource中没有数据时,开始输入,输入完成后,叫output来输出。如果发现有数据,就wait(); 当output发现Resource中没有数据时,就wait() ;当发现有数据时,就输...
摘要: 您好!当您打开此文件时,意味着你再IO流知识上出现了欠缺。如果你想仔细学习一下JavaSE的IO流部分知识,可以仔细阅读下面的知识点。 本文为系列文章的第四篇: 第一篇:JavaSE的IO流系列教程(1-4)—— File类的创建文件和获取文件目录 第二篇:JavaSE的IO流系列教程(2-4)——OutputStream类和InputStream类 第三篇:JavaSE的IO流系列教程(3-4)——BufferedStream类和BufferedReader类文章目录摘要:引言:FileUtils工具类的...
最近在学习java并发编程基础.一切从简,以能理解概念为主. 并发编程肯定绕不过线程.这是最基础的. 那么就从在java中,如何使用线程开始. 继承Thread类 继承Thread类,重写run方法,new出对象,调用start方法. 在新启的线程里运行的就是重写的run方法. 1 /**2 * 集成Thread类 实现run()3 */4 public class C1 extends Thread {5 6 @Override7 public void run() {8 try {9 Thread.sleep(100); 10 ...