美国上市公司,专注Java培训21年

什么是java多线程,java多线程的基本原理?


1、什么是多线程?

多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。

2、线程的工作原理:

每当我们开启一个线程的时候,线程会为我们开辟一块工作内存,将主内存中的共享变量复制一个副本存入工作内存中,并协调方法区生成栈针,以及对堆的引用(指针)。如果在执行过程中线程对工作内存中的共享变量进行的修改操作,此时会向主内存回写我们修改的变量。

3、多线程带来的问题

我们模拟这样一个场景:

有十个用户同时购票,但是系统中只剩下了8张票,当每个用户同时开启自己的线程,将主内存中8张票复制到工作内存中,在方法中,会判断票数是否满足要求,此时,十个线程都判断满足,都要对票数进行操作。当用户一操作后,票数=8-1=7,将数据回写至主内存。用户二操作后,用户二的本地内存中票数为8,则修改后票数=8-1=7,继续回写至主内存以此下去,在我们假设十个用户同时开启线程的情况下最后主内存中的票数肯定是7,而且十个用户均出票成功,出现了超卖的情况,这在现实场景是很危险的事!

4、多线程的特性

有序性:程序执行的顺序按照代码的先后顺序执行。

可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。若两个线程在不同的cpu,那么线程1改变了i的值还没刷新到主存,线程2又使用了i,那么这个i值肯定还是之前的,线程1对变量的修改线程没看到这就是可见性问题。

原子性:即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。在程序编译到执行的过程中,程序会经过多次重排序,源代码->编译器优化重排序->指令级并行重排序->内存系统重排序->最终执行的指令序列,也就是说我们编写的代码,经过这一连串的重排序后,代码很可能就和我们写的顺序不一致了,但是我们的操作系统等会保证我们最终执行的指令序列与我们的源代码的结果保持一致,我们的操作系统是可以保证单线程的有序性的。

5、怎么解决多线程并发带来的问题?

什么时候需要使用多线程?

竞态条件:检查后执行是否满足决定下一步。

方法一:加锁

监视器锁synchronized,它确保了每个线程是隔离的,而且只有当一个线程执行进入带有synchronized的方法中时加锁,当该线程为结束此方法解锁时,其它线程将挂起,直到该线程解锁后其它线程才能继续执行下去。它能够保证上述三大特性:有序性、可见性、原子性。JMM定义内存访问规范,实现有序性、可见性、原子性,共八大规则,大家可以上网了解JMM详细规则信息。

同步机制:

监视器锁synchronized

显示锁ReentrantLock、ReadWriteLock

原子变量AtomicInteger、AtomicLong、AtomicBoolean

Volatile

问题:遇到同步问题如何选择具体的实现方式?

监视器锁在jdk1.5以后,性能得到了很大的提升,并且在java版本更新中一直在被优化,而且synchronized锁可以自动实现加锁与解锁。显示锁需要我们手动解锁、加锁,容易失误导致死锁。在考虑性能时,推荐使用监视器锁,当考虑功能时,推荐使用显示锁,显示锁拥有更多自定义的选择。

方法二:线程封闭

什么是线程封闭?

当访问共享的可变数据时,通常需要同步,一种避免同步的方式就是不共享数据,如果仅在单线程内访问数据,就不需要同步,这种技术称为线程封闭。

如果使用线程封闭:

1.栈封闭:线程为跳用方法生成栈针时局部变量就使用了线程封闭。

2.ThreadLocal --> 只有当前线程能使用。

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • Java高级教程第二节:Java 集合框架
    Java高级教程第二节:Java 集合框架
    早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。 详情>>

    2019-05-30

  • Java高级教程第三节:Java 泛型
    Java高级教程第三节:Java 泛型
    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 详情>>

    2019-05-30

  • Java高级教程第四节:Java 序列化
    Java高级教程第四节:Java 序列化
    Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。 详情>>

    2019-05-30

  • Java高级教程第五节:Java 网络编程
    Java高级教程第五节:Java 网络编程
    # 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。 详情>>

    2019-06-13

  • Java开班时间

    收起