Java 并发性和多线程


阅读目录

  • 一、介绍
  • 二、多线程的优点
  • 三、多线程的代价
  • 四、如何创建并运行 java 线程
  • 五、竞态条件与临界区
  • 六、线程安全与共享资源
  • 七、线程安全及不可变性
  • 八、Java 内存模型
  • 九、Java同步块
  • 十、线程通信
  • 十一、死锁
  • 十二、避免死锁
回到顶部回到顶部回到顶部https://zh.wikipedia.org/wiki/%E4%B8%8A%E4%B8%8B%E6%96%87%E4%BA%A4%E6%8F%9B 

## 增加资源消耗 

线程在运行的时候需要从计算机里面得到一些资源。除了CPU,线程还需要一些内存来维持它本地的堆栈。它也需要占用操作系统中一些资源来管理线程。我们可以尝试编写一个程序,让它创建 100 个线程,这些线程什么事情都不做,只是在等待,然后看看这个程序在运行的时候占用了多少内存。

回到顶部回到顶部回到顶部回到顶部回到顶部Java中的堆和栈的区别

这张图演示了 Java 内存模型的逻辑视图。

每一个运行在 Java 虚拟机里的线程都拥有自己的线程栈。这个线程栈包含了这个线程调用的方法当前执行点相关的信息。一个线程仅能访问自己的线程栈。一个线程创建的本地变量对其它线程不可见,仅自己可见。即使两个线程执行同样的代码,这两个线程任然在在自己的线程栈中的代码来创建本地变量。因此,每个线程拥有每个本地变量的独有版本。

所有原始类型的本地变量都存放在线程栈上,因此对其它线程不可见。一个线程可能向另一个线程传递一个原始类型变量的拷贝,但是它不能共享这个原始类型变量自身。

堆上包含在 Java 程序中创建的所有对象,无论是哪一个对象创建的。这包括原始类型的对象版本。如果一个对象被创建然后赋值给一个局部变量,或者用来作为另一个对象的成员变量,这个对象任然是存放在堆上。

下面这张图演示了调用栈和本地变量存放在线程栈上,对象存放在堆上。

具体分析可详见文章:http://wiki.jikexueyuan.com/project/java-concurrent/java-memory-model.html

回到顶部回到顶部http://wiki.jikexueyuan.com/project/java-concurrent/thread-communication.html 

回到顶部http://wiki.jikexueyuan.com/project/java-concurrent/deadlock.html

回到顶部http://wiki.jikexueyuan.com/project/java-concurrent/deadlock-prevention.html