Java 理解多线程并发和同步

core-java
标签: #<Tag:0x00007f1d26719400>

#1

此文章大部分内容摘抄自从jvm的角度来看java的多线程

什么是同步?

java 多线程中我们常提到的同步, 其实就是当有多个线程同时访问同一个资源时, 因为无法保证多个线程操作同一个资源的顺序和时间点, 而设计的机制. 比如通过同步机制, 可以实现多个线程情况下同一个共享资源在同一时刻只能被一个线程使用, 而不是一哄而上, 无序混乱的访问资源.

什么是并发?

很简单, 就是多个线程同时执行.

什么时候需要同步机制? 什么时候不需要?

首先要理解什么样的资源可以被共享. 因为只有共享的资源才需要同步机制.
java里的变量可以分3类:

  • 类变量(类里面static修饰的变量)保存在“方法区”
  • 实例变量(类里面的普通变量)保存在“堆”
  • 局部变量(方法里声明的变量)保存在 “虚拟机栈”

830CFB1A-183F-423E-AE55-1B7D269219F0

  • “方法区”和“堆”都属于线程共享数据区. “虚拟机栈”属于线程私有数据区.
  • 局部变量是不能多个线程共享的, 因为它在“虚拟机栈”里.
  • 类变量和实例变量是可以多个线程共享的. 事实上, 在java中, 多线程间进行通信的唯一途径就是通过类变量和实例变量.
  • 如果一段多线程程序中如果没有类变量和实例变量, 那么这段多线程程序就一定是线程安全的.

所以结论为

  • 多线程最为复杂的情况只有一个:多个线程之间如何保证各个线程有序的访问及修改共享变量, 这里的变量指的就是类变量和实例变量.
  • 每个java线程都有一份自己的工作内存, 如果不考虑操作共享资源的情况, 每个线程都运行在自己的内存中, 互不干扰.

参考

从jvm的角度来看java的多线程 - 我是家宝 - 博客园