多线程:
好处: 同一时刻可以运行多段代码
多核处理器 : 拥有多个核心的处理器(单核cpu虽然看起来也是”多线程“,其实是并发,不断切换的执行多个线程,因为cpu执行效率高,速度快,看起来像是在一起运行)
程序 : 一块静态代码, QQ.exe LOL.exe
进程 : 运行程序, 会加载进系统, 会为其分配独立的内存空间
线程 : 动态程序中的运行代码块, 可以有多个
线程的几个方法:
线程名字
Thread类: setName() getName()
当在main方法中System.out.println(Thread.currentThread().getName());
当前main的线程名称, 所以一般情况下我们称main线程为主线程,其他线程为子线程
一个Java程序运行的话至少会有三个线程 :
1. main(主线程)
2. GC(垃圾回收线程)
3.异常处理线程
-----------------------------------------------
线程休眠sleep : 强制降低线程的执行速度, 我们就让一个线程暂时的休眠一下
-----------------------------------------------
线程优先级Priority : 线程的优先级越高, 越有机会获得CPU的执行权 (1-10 默认是:5)
-----------------------------------------------
线程同步synchronized : 多个线程访问同一资源时, 需要考虑到的问题
事务: T-SQL 事务四个特性
一致性: 事务前后数据保持一致
原子性: 不可分割 一起成功 一起失败
永久性: 事务提交之后对数据的修改是永久
隔离性: 1个事务在执行时 不允许另一个事务介入
同步 : 同一时间只执行一个事情, 效率低, 但是安全性高
异步 : 同一时间可以执行多个事情, 效率高, 但是安全性低 默认的多线程是异步的
当发现用异步的机制去处理共享资源的时候, 会出现问题
synchronized 同步的关键
处理同步问题有三种方式:
1. 同步代码块 (将操作共享资源的代码进行封装,括号内的是同步锁,只要是一个唯一的对象即可,使用this请确保当前类的对象是唯一的)
synchronized (this) {
需要同步的内容
}
2. 同步方法(实列同步方法默认同步锁是this,静态同步方法默认同步锁是当前类.class,使用时请注意)
同步整个方法, 一个时刻只能有1个对象执行该方法, 其他对象都在外面等
public synchronized void run() {
}
3.使用ReentrantLock对象(最常用手动开锁,关锁使用更灵活)
ReentrantLock lock=new ReentrantLock(fair参数); //参数为是否公平的(true:分时调度 false:抢占式调度)
try{
lock.lock(); //上锁
}catch(){
}finally{
lock.unlock(); //释放锁
}