同时读写
1.CopyOnWriteArrayList/ReadWriteLock 适合在读操作远大于写操作的场景里,比如缓存 2.ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法 3.ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。 4.hashmap的底层是数组加链表的结构,它的线程是不安全的,而hastable是在hashmap的基础上,对整个哈希表(数组)加锁 sychronized实现线程安全。而我们知道,方法访问数组中的数据,可能只涉及到数组的部分,对整个数组加锁会降低线程并发执行的效率,所以如果对数组分段加锁,使用segment分片锁,这样一个线程只会锁住数组的一片,其他线程仍可以访问数组的其他片进行写操作,具有这样的分片锁的机制是就是concurrenthashmap
Volatile
与锁相比,Volatile变量是一种非常简单但同时又非常脆弱的同步机制,它在某些情况下将提供优于锁的性能和伸缩性。如果严格遵循 volatile 的使用条件 —— 即变量真正独立于其他变量和自己以前的值 —— 在某些情况下可以使用 volatile 代替 synchronized 来简化代码。然而,使用 volatile 的代码往往比使用锁的代码更加容易出错。 volatile只能保证变量的安全,不能保证线程的安全,volatile 满足内存可见性,但不满足操作原子性
ReadWriteLock
ReadWriteLock 当写操作时,其他线程无法读取或写入数据,而当读操作时,其它线程无法写入数据,但却可以读取数据 。适用于 读取远远大于写入的操作.
ConcurrentHashMap
ConcurrentHashMap可以让读取不加锁,但是写入要加锁。很容易想明白,读写都会进行的操作中,必然是要把写加锁的,不可能不加锁。
Collection 与 Map
Collection —–List —–LinkedList 非同步 —-ArrayList 非同步,实现了可变大小的元素数组 —-Vector 同步 ——Stack —–Set 不允许有相同的元素
Map —–HashTable 同步,实现一个key–value映射的哈希表 —–HashMap 非同步, —–WeakHashMap 改进的HashMap,实现了“弱引用”,如果一个key不被引用,则被GC回收
Hashtable直接使用对象的hashCode,HashMap重新计算hash值,而且用与代替求模
类中静态语句块仅在类加载时被执行一次
类中静态语句块仅在类加载时被执行一次
Collection与Map
Collection有两个子接口List和Set ArrayList,Vector,LinkedList是List的实现类 ArrayList,Vector底层是数组,Vector是线程安全的 LinkedList底层是链表,线程不安全 HashTable HashMap是Map的实现类 HashTable线程安全,不能放null HashMap线程安不全,能放null
Servlet
GenericServlet 抽象类 给出了设计 servlet 的一些骨架,定义了 servlet 生命周期,还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的。 doget/dopost与Http协议有关,是在 javax.servlet.http.HttpServlet 中实现的
修饰符
类内部,同一个包,子类,任何地方 private default protected public
Statement
A,Statement是最基本的用法,采用字符串拼接的方式,存在注入漏洞 B,PreparedStatement对Statement中的SQL语句进行预编译,同时检查合法性,效率高 C,CallableStatement接口扩展PreparedStatement,用来调用存储过程,它提供了对输出和输入/输出参数的支持。CallableStatement 接口还具有对 PreparedStatement 接口提供的输入参数的支持。 D,BatchedStatement用于批量操作数据库,BatchedStatement不是标准的Statement类
抽象与接口
A 接口与抽象类是不同的概念。抽象类是用于捕捉子类的通用特性,接口是抽象方法的集合; B 实现接口必须实现接口的所有方法; C 接口可以继承一个或多个接口,抽象类只能继承一个类或者实现多个接口; D 一个类只能继承一个类,但是可以实现多个接口。
JVM内存
运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器 虚拟机栈区 :也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和 returnAddress ,在编译期间完成分配。 堆区, JAVA 堆,也称 GC 堆,所有线程共享,存放对象的实例和数组, JAVA 堆是垃圾收集器管理的主要区域。 方法区:所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。 程序计数器 :线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址。
JVM更详细的解释
运行时数据区包括:程序计数器、虚拟机栈、本地方法栈、Java堆、方法区以及方法区中的运行时常量池
1、程序计数器: 线程私有,是当前线程所执行的字节码的行号指示器,如果线程正执行一个java方法,计数器记录正在执行的虚拟机字节码指令的地址,如果线程正在执行的是Native方法,则计数器值为空;
2、虚拟机栈: 即栈区, 线程私有 ,为虚拟机执行 Java 方法(字节码)服务,每个方法在执行的时会创建一个栈帧用于存放局部变量表、操作数栈、动态链接和方法出口等信息,每个方法的调用直至执行完成对应于栈帧的入栈和出栈;
3、本地方法栈: 为虚拟机使用的 N ative 方法服务,也是 线程私有 ;
4、Java 堆: 在虚拟机启动时创建, 线程共享 ,唯一目的是存放对象实例,是垃圾收集器管理的主要区域——” GC 堆“,可以细分为新生代和老年代,新生代又可以细分为 Eden 空间、 From Survivor 空间和 To Survivor 空间;物理上可以不连续,但逻辑上连续,可以选择固定大小或者扩展;
5、方法区: 线程共享 ,用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。被称为“永久代”,是因为 H otSpot 虚拟机的设计团队把 GC 分代收集扩展到方法区,即使用永久代来实现方法区,像 GC 管理 Java 堆一样管理方法区,从而省去专门为方法区编写内存管理代码,内存回收目标是针对常量池的回收和堆类型的卸载; 6、运行时常量池: 线程共享 ,是方法区的一部分, Class 文件中存放编译期生成的各种字面量和符号引用,类加载后进入方法区的运行时常量池中。
throw 与throws
throws用于在方法上声明该方法不需要处理的异常类型,用在方法上后面跟异常类名 可以是多个异常类 throw用于抛出具体异常类的对象,用在方法内 后面跟异常对象只能是一个异常类型实体.