Java多线程之线程安全的相关概念

Java线程的实现:
Java线程模型是基于操作系统原生线程模型来实现的;线程模型只对线程的并发规模和操作成本产生影响,对Java程序的编写和运行过程来说,并没有什么不同;

Java线程调度:
线程调度是指系统为线程分配处理器使用权的过程;主要调度方式有:抢占式线程调度、协同式线程调度;
抢占式线程调度:每个线程由系统来分配执行时间,线程的切换不由线程本身决定;Java默认使用的线程调度方式是抢占式线程调度;我们可以通过Thread.yield()使当前正在执行的线程让出执行时间,但是,却没有办法使线程去获取执行时间;
协同式线程调度:每个线程的执行时间由线程本身来控制,线程执行完任务后主动通知系统,切换到另一个线程上;
两种线程调度方式的优缺点:
协同式的优点:实现简单,可以通过对线程的切换控制避免线程安全问题;
协同式的缺点:一旦当前线程出现问题,将有可能影响到其他线程的执行,最终可能导致系统崩溃;
抢占式的优点:一个线程出现问题不会影响到其他线程的执行(线程的执行时间是由系统分配的,因此,系统可以将处理器执行时间分配给其他线程从而避免一个线程出现故障导致整个系统崩溃的现象发生);

Java线程优先级:
可以通过设置线程的优先级,使得线程获得处理器执行时间的可能性变化,但采用这种方式来实现线程获取处理器执行时间的顺序上的改变并不可靠(因为系统的优先级和Java中的优先级不是一一对应的,有可能Java中多个线程优先级对应于系统中同一个优先级);Java中有10个线程优先级,从1(Thread.MIN_PRIORITY)到10(Thread.MAX_PRIORITY);

Java线程的线程状态:
Java语言定义了5种线程状态,在任意一个时间点,一个线程只能处于其中的一个状态;
5个线程状态分别为:新建(New)运行(Runnable)等待(Waiting/Timed Waiting)阻塞(Blocked)结束(Terminated)

线程安全:
线程安全问题一定是基于多个线程之间存在访问共享数据这一前提下的;如果多个线程之间不会访问同一个变量,那么就不存在线程安全的问题;
按照线程安全的强弱程度可以将各种共享变量的操作分为:不可变、绝对线程安全、相对线程安全、线程兼容以及线程对立这五种情况;
①不可变
如果共享变量是不可变的对象,那么对该共享变量的多线程操作一定是线程安全的,因为对象是不可变的,所以任何线程都不可以改变共享变量的状态,也就不会出现脏读等现象;
如果共享变量是一个基本数据类型的变量,那么可以使用final关键字保证其是不可变的;
如果共享变量是一个对象,那么就需要保证对象的行为不会改变该对象的状态,即对象的行为不能改变当前对象的状态,可以将一个类的所有字段使用final关键字修饰,那么就可以保证该类的对象是不可变的,如java.lang.String类
②绝对线程安全
绝对线程安全是指不需要在调用端进行任何同步处理,就能保证代码在多线程并发的场景下保证线程安全的;Java API中标注为线程安全的类,大多数都不是绝对的线程安全;
③相对线程安全
Java API中标注为线程安全的类,大多数都是相对的线程安全;也就是通常意义上的线程安全,即保证对共享变量单独操作时是线程安全的,调用时可以不用额外的保障措施;例如Vector、HashTable、通过Collections的synchronizedCollection()方法包装的集合等;
④线程兼容
线程兼容指对象本身并不是线程安全的,但是可以通过在调用端正确采用同步手段来保证对象在并发环境中可以安全地使用;通常意义上的非线程安全;Java API中的大部分类都是线程兼容的,例如ArrayList、HashMap等
⑤线程对立
线程对立是指无论调用端采用什么同步措施都不能保证多线程环境中的线程安全;线程对立很少出现;例如Thread类的suspend()和resume()方法;

总结:清楚了Java多线程的相关基础概念之后,就可以继续对Java中是如何保证线程安全的深入学习啦!对于线程安全的实现方法,可以阅读相关博文——Java多线程之线程安全的实现方法

猜你喜欢

转载自blog.csdn.net/boker_han/article/details/79466524
今日推荐