目录
设计原则
迪米特法则( LOD)
合成复用原则
共同封闭原则
里氏替换原则
数据库
Mysql
JPA
线程
创建线程的方式
1.继承Thread
2.实现Runnable
3.通过Callable和FutureTask创建线程
4.通过线程池创建线程
线程状态
1.初始(NEW)
2.运行(RUNNABLE)
3.阻塞(BLOCKED)
4. 终止(TERMINATED)
守护线程
线程锁
悲观锁和乐观锁
模拟抢票案例
窗口抢票
设计原则
迪米特法则( LOD)
迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,降低类之间的耦合(解耦)。
合成复用原则
尽量使用对象组合,而不是通过继承来达到复用的目的。
共同封闭原则
当因为某个原因需要修改应用程序里的代码时,把需要修改的范围限制在一个最小范围内的包里。
里氏替换原则
在父类出现的地方都可以由子类替换
。。。
数据库
Mysql
增删改查
INSERT INTO table_name ( field1, field2,...)
VALUES
( value1, value2,...);
UPDATe table_name SET field_name=new-value1, field_name=new-value2 where ...
DELETE FROM table_name WHERe ...
其他
DISTINCT、UNIOn、ORDER BY、GROUP BY、INNER JOIN、LEFT JOIN、LEFT JOIN、AVG()、COUNT()、SUM()、MAX()、MIN()、IS NOT NULL、curdate()、DATE_ADD(curdate(),INTERVAL -1 DAY) ......
JPA
2个关键时刻很好用的注解
@NotFound(action = NotFoundAction.IGNORE)//找不到外连接对应数据就忽视 @Transient//数据库没有对应字段,用于前后端数据传输
jpa相关文章
线程
创建线程的方式
1.继承Thread
优点:访问当前线程直接使用this即可,无需使用Thread.currentThread()方法
缺点:Java是不支持多继承
2.实现Runnable
优点:可以实现多个接口。
缺点:要访问当前线程必须使用Thread.currentThread()方法。
3.通过Callable和FutureTask创建线程
优点:有返回值、重写的Call方法可以抛出异常。
缺点:存取一些项慢。
4.通过线程池创建线程
优点:可以创建固定大小。
缺点:编程繁琐,不好理解。
线程状态
1.初始(NEW)
新创建还没有调用start()方法的线程对象。
2.运行(RUNNABLE)
①就绪(READY):线程对象创建后,有线程调用了该对象的start()方法。就绪(READY)的线程位于可运行线程池中,等待cpu调度。
②运行中(RUNNING):cpu调度就绪(READY)的线程,执行程序代码。
3.阻塞(BLOCKED)
等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
4. 终止(TERMINATED)
线程执行完了或者因异常退出了run()方法,该线程结束生命周期
守护线程
在Java中线程分为两中类型:用户线程 (User Thread)、守护线程 (Daemon Thread)。
一般来说,守护线程经常被用来执行一些后台任务,同时又希望在程序退出( JVM 退出)时,线程能够自动关闭,此时,守护线程是首选。
JVM 中的垃圾回收线程就是典型的守护线程
线程锁
悲观锁和乐观锁
悲观锁:对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,只要对资源进行操作就会直接上了锁就操作资源了。
乐观锁:这是一种思想,相比悲观锁,乐观锁认为数据一般情况下不会产生并发冲突,所以在数据提交更新时才会对数据进行检测。
模拟抢票案例
public class TicketThread extends Thread {
// 总票数,多个线程共享
private static int ticket = 10;
// 重写run方法
@Override
public void run() {
// 业务处理
while (true) {
// 对象锁
synchronized (this) {
// 判断一个条件,出去条件
if (ticket <= 0) {
break;
}
System.out.println("窗口:" + Thread.currentThread().getName()
+ ", 剩余票数:" + ticket--);
}
// 方法执行太快,减速
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 3个窗口都买这一个票
public static void main(String[] args) {
// 目标
Thread target = new TicketThread();
for (int i = 0; i < 3; i++) {
new Thread(target).start();
}
}
}



