0616
数据库三范式:
1、第一范式:数据库表中的所有字段值都是不可分解的原子值;
2、第二范式:需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言);
3、第三范式:需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
juc三大工具类:
CountDownLatch(闭锁):
CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后,它才执行;
当一个或多个线程调用await方法时,这些线程会阻塞
②. 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)
③. 计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。
CyclicBarrier:
可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用
Semaphore(信号量):
Semaphore翻译成字面意思为 信号量,Semaphore可以控制同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
volatile关键字:
jvm内存模型:
线程间通信方式:
方式一:使用 volatile 关键字
基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想,大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式
方式二:使用Object类的wait() 和 notify() 方法
众所周知,Object类提供了线程间通信的方法:wait()、notify()、notifyaAl(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。
注意: wait和 notify必须配合synchronized使用,wait方法释放锁,notify方法不释放锁
方式三:使用JUC工具类 CountDownLatch
进程间通信方式:
管道pipe:
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
命名管道FIFO:
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
消息队列MessageQueue:
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享存储SharedMemory:
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
信号量Semaphore:
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
套接字Socket:
套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
信号 ( sinal ) :
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
threadlocal:
简介:
多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。
ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题。
java 中的newinstance:
单例模式和工厂模式:
单例模式:可以防止 数据的冲突,节省内存空间
某一类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。
饿汉模式:
// 饿汉式:
public class Singleton{
//创建私有构造方法
private Singleton(){};
//创建私有静态的成员变量并实例化
private final static Singleton instance = new Singleton();
//静态工厂实例
public static Singleton getInstance(){
return instance;
}
}
懒汉模式:
// 懒汉式:
public class Singleton{
//创建私有构造方法
private Singleton(){};
//创建私有静态的成员变量
private Singleton instance=null;
//静态工厂实例
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton;
}
return instance;
}
}
饿汉模式与懒汉模式的区别:
是在于建立单例对象的时间的不同。
“饿汉式”是在不管你用的用不上,一开始就建立这个单例对象:比如:有个单例对象
“懒汉式”是在你真正用到的时候才去建这个单例对象:
饿汉模式与懒汉模式的优缺点:
饿汉式:
优点:在多线程模式下是线程安全的;
缺点:提前创建好对象,如果项目中没有用到,则会浪费资源。
懒汉式:
优点:只有在调用方法的时候才会创建对象,不会造成资源的浪费;
缺点:线程不安全。在多线程模式下,一个线程进入if判断语句,还未来得及执行,另一个语句也进入,则会造成创建多个对象。
工厂模式:
在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
Spring:
IOC:
1、IOC就是控制反转,指创建对象的控制权转移给Spring框架进行管理,并由Spring根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部依赖。
2、Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。
AOP:
1、AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。