Java基础回顾 —线程同步详解

  1. 停止线程的方式:
    不能使用Thread类的stop方法来终止线程的执行,一般要设定一个变量,在run方法中是一个循环,循环每次检查该变量,如果满足条件则继续执行,否则跳出循环,线程结束。
  2. 不能依靠线程的优先级来决定线程的执行顺序
    通过实现Runnable接口的多线程类,该类的属性会被多个线程共享,就会导致资源同步的问题。如果多个任务以一种会引起冲突的方式访问一个公共的资源,称为竞争状态。如果一个类的对象在多线程程序中没有导致竞争状态,则称这样的类为线程安全的
  3. synchronized关键字
    当修饰一个方法时,该方法叫做同步方法。
  4. java中的每个对象都有一个锁lock,或者叫做监视器monitor,当访问某个对象的synchronized方法时, 表示将该对象上锁, 此时其他线程都无法访问该对象的synchronized方法,知道之前那个线程执行方法完毕后或者抛出了异常,那么该对象的锁会释放,其他线程才有可能再去访问该synchronized方法。
  5. 如果一个对象有多个synchronized方法,在某个时刻线程已经进入了某个synchronized方法,那么在该方法没执行完之前,其他线程无法访问该对象的任何synchronized方法
  6. 如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的不是synchronized所在的对象,而是synchronized方法所在对象对应的Class对象,因为java中无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程访问同一个类的两个对象的两个static、synchronized方法,他们也是顺序执行,也就是一个线程先执行方法,完成后另一个线程才开始执行。
  7. synchronized块,写法:
    synchronized(Object){}: 表示线程在执行的时候会对Object对象上锁。
    synchronized(this){}: 表示线程在执行的时候会对当前对象上锁。
  8. synchronized方法时粗粒度的并发控制,某一时刻只能有一个线程执行该synchronized方法。
    synchronized块则是一种细粒度的并发控制,只会讲块中的代码同步,位于方法内、synchronized块之外的代码可以被多个线程同时访问到。
posted @ 2017-04-10 22:28  涣涣虚心  阅读(165)  评论(0编辑  收藏  举报