您的位置 首页 java

告诉你什么是java多线程定义及线程安全

1、什么是java 多线程

举个简单易懂的例子,多 线程 相当于一条马路上的多条车道,单车道行驶车辆速度较慢,且可能产生拥堵,多车道可缓解车速、拥堵情况。

  1. 线程是指进程中的一个执行流程,一个进程中可以运行1-n个线程。也可以说是在同一个进程内又可以执行多个任务,而每一个任务我们就可以看成是一个线程。
  2. 是程序的执行单元,执行路径。是程序使用CPU的最基本的单位
  3. 如果程序只有一条执行路径,那么该程序就是单线程程序
  4. 如果程序有多条执行路径,那么该程序就是多线程程序

2、多线程的意义:

  1. 多线程不是为了提高程序的执行速度,而是为了提高程序的使用率。
  2. 多线程的执行都是为了抢占CPU的使用率。
  3. 不能保证多线程程序会在什么时候优先抢到使用权,所以线程的执行具有随机性

3、多线程的优点:

  • 充分利用硬件资源。由于线程是cpu的基本调度单位,所以如果是单线程,那么最多只能同时在一个 处理器 上运行,意味着其他的CPU资源都将被浪费。而多线程可以同时在多个处理器上运行,只要各个线程间的通信设计正确,那么多线程将能充分利用处理器的资源。
  • 多线程程序能将代码量巨大,复杂的程序分成一个个简单的功能模块,每块实现复杂程序的一部分单一功能,这将会使得程序的建模,测试更加方便,结构更加清晰,更加优雅
  • 为了避免阻塞,单线程应用程序必须使用非阻塞I/O,这样的I/O复杂性远远高于同步I/O,并且容易出错。

4、多线程的缺点:

  • 线程安全 :由于统一进程下的多个线程是共享同样的地址空间和数据的,又由于线程执行顺序的不可预知性,一个线程可能会修改其他线程正在使用的变量,这一方面是给数据共享带来了便利;另一方面,如果处理不当,会产生脏读,幻读等问题,好在Java提供了一系列的同步机制来帮助解决这一问题,例如内置锁。
  • 活跃性问题。可能会发生长时间的等待锁,甚至是 死锁
  • 性能问题。 线程的频繁调度切换会浪费资源,同步机制会导致内存缓冲区的数据无效,以及增加同步流量。

5、java中的线程安全是什么:

  • JAVA线程安全从总体上来说,是指Java对象在多线程运行环境下的一种特性,表现为常规(区别于特殊调用情况)情况下每次调用都能得到正确的逻辑结果。从本质上来说,将对象的方法行为加上了同步控制逻辑,而调用者无须做其他额外的同步控制就可以安全放心的使用对象。
  • 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替运行,并且在主调试代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,则称这个类时线程安全的。线程安全类中封装了必要的同步机制,因此客户端无须进一步采取同步措施。

6、解决机制:

1. 加锁。

(1) 锁能使其保护的代码以串行的形式来访问,当给一个复合操作加锁后,能使其成为 原子操作 。一种错误的思想是只要对写数据的方法加锁,其实这是错的,对数据进行操作的所有方法都需加锁,不管是读还是写。

(2) 加锁时需要考虑性能问题,不能总是一味地给整个方法加锁synchronized就了事了,应该将方法中不影响共享状态且执行时间比较长的代码分离出去。

(3) 加锁的含义不仅仅局限于互斥,还包括可见性。为了确保所有线程都能看见最新值,读操作和写操作必须使用同样的锁对象。

2. 不共享状态

(1) 无状态对象: 无状态对象一定是线程安全的,因为不会影响到其他线程。

(2) 线程关闭: 仅在单线程环境下使用。

3. 不可变对象

可以使用final修饰的对象保证线程安全,由于final修饰的引用型变量(除String外)不可变是指引用不可变,但其指向的对象是可变的,所以此类必须安全发布,也即不能对外提供可以修改final对象的接口。

文章来源:智云一二三科技

文章标题:告诉你什么是java多线程定义及线程安全

文章地址:https://www.zhihuclub.com/181160.shtml

关于作者: 智云科技

热门文章

网站地图