Java多线程

³程序Program:指令集,静态概念。
³进程Process:操作系统,调度程序,动态概念。
² 进程是程序的一次动态执行过程,占用特定的地址空间
² 每个进程都是独立的,由三部分组成: cpu,data,code
² 一个程序就是一个进程。
³线程Thread:在进程内,多条执行路径。(不同的执行路径)
² 一个进程可以拥有多个并行的( concurrent )线程。
² 一个进程中的线程共享相同的内存单元 / 内存地址空间 -> 可以访问相同的变量和对象,而且它们从同一个堆中分配对象 -> 通信、数据交换、同步操作。

±会造成并发的问题。

³根本区别:
² 进程:
± 作为资源分配的单位
² 线程:
± 调度和执行的单位
³包含关系:
² 如果一个进程内部拥有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的。

一个进程是一个正运行的应用程序的实例 。它由两个部分组成:一个是操作系统用来管理这个进程内核对象。另一个是这个进程拥有的地址空间。从执行角度方面看,一个进程由一个或多个线程组成。一个线程是一个执行单元,它控制CPU执行进程中某一段代码段。一个线程可以访问这个进程中所有的地址空间和资源。一个进程最少包括一个线程来执行代码,这个线程又叫做主线程
 
线程除了能够访问进程的资源外,每个线程还拥有自己的栈 


l新生状态:
l用new关键字和Thread类或其子类建立一个线程对象后,访问线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)
l就绪状态:
l处于就绪状态的线程已经具备了运行条件,但还没有分配到cpu,处于线程就绪队列,等待系统为其分配cpu。等待状态并不是执行状态。
l运行状态:
l在运行状态和线程执行自己的run方法中代码,直到调用其他方法而终止或等待某资源而阻塞或完成任务而死亡。
l阻塞状态:
l处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。
l死亡状态:
死亡状态是线程生命周期中的最后一个阶段。线程死亡的原因有两个,一个是正常运行的线程完成了它的全部工作;另一种是线程被强制执行的终止,如:通过执行stop或destory方法来终止一个线程(前者会产生异常,后者是强制终止不会释放锁,都不推荐

³无论synchronized关键字加在方法上还是对象上,它取得的锁都是锁在了对象上,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
³每个对象只有一个锁(lock)与之相关联。
³实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
³搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。
³还有一些技巧可以让我们对共享资源的同步访问更加安全:
² 定义 private instance 变量 + 它的 get 方法,而不要定义 public/protected instance 变量。如果将变量定义为 public ,对象在外界可以绕过同步方法的控制而直接取得它,并改动它。
² 如果 instance 变量是一个对象,如数组或 ArrayList 什么的,那上述方法仍然不安全,因为当外界对象通过 get 方法拿到这个 instance 对象的引用后,又将其指向另一个对象,那么这个 private 变量也就变了,岂不是很危险。 这个时候就需要将 get 方法也加上 synchronized 同步,并且,只返回这个 private 对象的 clone()―― 这样,调用端得到的就是对象副本的引用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值