多线程原理及并发问题

作者: 049032247b6b | 来源:发表于2019-07-12 21:34 被阅读6次

1.什么是多线程?

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

2.了解多线程

了解多线程之前我们先搞清楚几个重要的概念!

如上图所示:对我们的项目有一个主内存,这个主内存里面存放了我们的共享变量、方法区、堆中的对象等。

3.线程的工作过程

每当我们开启一个线程的时候,线程会为我们开辟一块工作内存,将主内存中的共享变量复制一个副本存入工作内存中,并协调方法区生成栈针,以及对堆的引用(指针)。

如果在执行过程中线程对工作内存中的共享变量进行的修改操作,此时会向主内存回写我们修改的变量。

4.多线程带来的问题

1 线程间对数据的干扰 2 并发情况下对共享变量带来的数据不同步

5.多线程的特性

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

可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

若两个线程在不同的cpu,那么线程1改变了i的值还没刷新到主存,线程2又使用了i,那么这个i值肯定还是之前的,线程1对变量的修改线程没看到这就是可见性问题。

原子性:即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

在程序编译到执行的过程中,程序会经过多次重排序,源代码->编译器优化重排序->指令级并行重排序->内存系统重排序->最终执行的指令序列,

也就是说我们编写的代码,经过这一连串的重排序后,代码很可能就和我们写的顺序不一致了,但是我们的操作系统等会保证我们

最终执行的指令序列与我们的源代码的结果保持一致,我们的操作系统是可以保证单线程的有序性的。

6.怎么解决多线程并发带来的问题?

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

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

方法一:加锁

1.监视器锁synchronized,它确保了每个线程是隔离的,而且只有当一个线程执行进入带有synchronized的方法中时加锁,

当该线程为结束此方法解锁时,其它线程将挂起,直到该线程解锁后其它线程才能继续执行下去。它能够保证上述三大特性:有序性、可见性、原子性。

JMM定义内存访问规范,实现有序性、可见性、原子性,共八大规则,大家可以上网了解JMM详细规则信息。

同步机制:

  • 监视器锁synchronized
  • 显示锁ReentrantLock、ReadWriteLock
  • 原子变量AtomicInteger、AtomicLong、AtomicBoolean
  • Volatile

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

监视器锁在jdk1.5以后,性能得到了很大的提升,并且在java版本更新中一直在被优化,而且synchronized锁可以自动实现加锁与解锁。

显示锁需要我们手动解锁、加锁,容易失误导致死锁。

在考虑性能时,推荐使用监视器锁,当考虑功能时,推荐使用显示锁,显示锁拥有更多自定义的选择。

方法二:线程封闭

什么是线程封闭?

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

如果使用线程封闭:
1.栈封闭:线程为跳用方法生成栈针时局部变量就使用了线程封闭。
2.ThreadLocal --> 只有当前线程能使用。

方法三:不可变对象一定是线程安全的。

最佳方案:使用线程安全的对象是实现线程安全的。 java.util.concurrent包下的类。

比如 闭锁 CountDownLatch、ConcurrentHashMap、HashTable 、ThreadPoolExecutor 

最后

如果你看到了这里,觉得文章写得不错就给个赞呗!欢迎大家评论讨论!如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足,定期免费分享技术干货。谢谢!

相关文章

  • 多线程原理及并发问题

    1.什么是多线程? 多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多...

  • 多线程原理及并发问题

    1.什么是多线程? 多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多...

  • 后端架构师技术图谱(三)-并发、锁、设计模式(二)

    并发 多线程 《40个Java多线程问题总结》 线程安全 《Java并发编程——线程安全及解决机制简介》 一致性、...

  • 2021-03-01 深度剖析并发锁之AQS设计思想及原理

    深度剖析并发锁之AQS设计思想及原理 了解锁的场景和基本原理 多线程并发处理,没有同步导致结果异常本质上是由于++...

  • Java并发机制底层原理

    本文为对Java并发编程中并发机制底层原理的总结,包括以下几部分: 为什么多线程下会有并发问题 Synchroni...

  • 学习方向

    多线程,并发,锁机制,集合内部实现及原理,OOM,CPU性能分析,JVM调优,内存模型,类加载,spring,事务...

  • 由浅深入理解java多线程,java并发,synchronize

    由浅深入理解java多线程,java并发,synchronized实现原理及线程锁机制 [TOC] 多进程是指操作...

  • ThreadLocal解析

    原理 产生线程安全问题的根源在于多线程之间的数据共享。如果没有数据共享,就没有多线程并发安全问题。ThreadLo...

  • ThreadLocal解析

    原理 产生线程安全问题的根源在于多线程之间的数据共享。如果没有数据共享,就没有多线程并发安全问题。ThreadLo...

  • 蚂蚁金服面试

    一面 hashmap的实现原理,多线程并发操作hashmap会有什么问题?原理简述:使用数组加链表的数据结构,根据...

网友评论

    本文标题:多线程原理及并发问题

    本文链接:https://www.haomeiwen.com/subject/rqhukctx.html