多线程
* 进程和线程 >**线程其实就是一个执行路径,进程是独立应用,一个进程中有N多条不用的线程,进程是所有线程的集合。** * 什么是多线程 > **同一时刻有多条不用的执行路径,同时进行执行。目的:提高程序的执行效率。** * 多线程运行状态 > **新建状态→就绪状态→运行状态→堵塞状态→死亡状态** * 什么是线程安全 > **当读个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。 > 做读的操作时不会发生数据冲突问题** * 如何解决多线程之间安全问题 > **使用多项成之间同步或使用锁(lock)** * 为什么使用线程同步或使用锁能解决线程安全问题 > **将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。 > 被包裹的代码执行完成后释放锁,然后才能让其他线程进行执行。这样的话就可以解决线程不安全问题** * 什么线程之间同步 > **当多个线程同时共享同一个资源,不会受到其他线程干扰** * 什么是同步代码块 > **就是将可能发生线程安全问题的代码,给包裹起来。只能让当前一个线程进行执行,被包裹的代码执行完成之后才能释放锁,然后才能让其他线程进行执行** * 多项成同步分类 1. 使用同步代码块 >synchronized(同一个数据){ > 可能会发生线程冲突问题 > }private Object mutex = new Object();// 自定义多线程同步锁
public void sale() {
synchronized (mutex) {
if (trainCount > 0) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + ",出售 第" + (100 - trainCount + 1) + "张票.");
trainCount--;
}
}
}
- 使用同步函数
在方法上修饰synchronized称为同步函数
public synchronized void sale() {
if (trainCount > 0) {
try {
Thread.sleep(40);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + ",出售 第" + (100 - trainCount + 1) + "张票.");
trainCount--;
}
}
- 静态同步函数
- 方法上加上static关键字,使用synchronized关键字修饰为静态同步函数
- 静态的同步函数使用的锁是该函数所属字节码文件对象