`
hao861002
  • 浏览: 86498 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java复习第十三天

阅读更多

一、
  ■ 阻塞状态
 
    ▲ 初始状态                ▲阻塞状态          ▲终止状态
        \                  /           ^ 1           ^
         \                /             \ 2sleep    /
          \start        /                \ 3join   /stop
           \           /                  \       /
            V        V                     \     /
         ▲ 可运行状态 _ _ _ _ OS选中 _ _ _ _\ ▲运行状态
          (只缺CPU)   \  CPU到期或调用yield
          
    下面为线程中的7中非常重要的状态:(有的书上也只有认为前五种状态:而将“锁池”和“等待池”都看成是“阻塞”状态的特殊情况:这种认识也是正确的,但是将“锁池”和“等待池”单独分离出来有利于对程序的理解)
    1,初始状态,线程创建,线程对象调用start()方法。
    2,可运行状态,也就是等待Cpu资源,等待运行的状态。
    3,运行状态,获得了cpu资源,正在运行状态。
    4,阻塞状态,也就是让出cpu资源,进入一种等待状态,而且不是可运行状态,有三种情况会进入阻塞状态。
      1)如等待数据输入(输入设备进行处理,而CPU不处理),则放入阻塞,直到输入完毕,阻塞结束后会进入可运行状态。
      2)线程休眠,线程对象调用sleep()方法,阻塞结束后会进入可运行状态。
     public static void sleep(long millis)
               throws InterruptedException
    括号中以毫秒为单位, 使线程停止一段时间,间隔期满后,线程不一定立即恢复执行。
    当main()运行完毕,即使在结束时时间片还没有用完,CPU也放弃此时间片,继续运行其他程序。
  try{
  Thread.sleep(1000);
  }catch(InterruptedException e){
  e.printStackTrace(e);
  }
  线程中有异常,只能trycatch,子类中不能抛出比父类更多的异常,父类run方法没有抛出异常。
      3)线程对象2调用线程对象1的join()方法,那么线程对象2进入阻塞状态,直到线程对象1中止。
       public final void join() throws InterruptedException
    表示其他运行线程放弃执行权,进入阻塞状态,直到调用线程结束。
    实际上是把并发的线程变为串行运行。
t1 num
t2 char  if(c=='m') -> t1.join()
//t2对t1调用join,t2进入了阻塞状态
//当条件成立时,t1加入打印数字,一直到打印完,此时t2继续运行

    5,中止状态,也就是执行结束。
    6,锁池状态
    7,等待队列
 
二、 共享数据的并发处理
(一)
  ■ 数据的错误发生
  多线程并发访问同一个对象(临界资源)
  破坏了原子操作,就会发生数据不一致的情况

(二) 共享数据的并发处理
  ■ 多线程同时并发访问的资源叫做临界资源。
    多个线程同时访问对象并要求操作相同资源时分割了原子操作就会出现问题。(原子操作,不可再分的操作)会出现数据的不一致或数据不完整,为避免这种现象采用对访问的线程做限制的方法。

  ■ 互斥锁机制,利用每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个琐是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程。

  ■ Synchronized用法
    1.Synchronized修饰代码块(同步代码块),
     public void push(char c){
         synchronized(this)//只有持有当前对象锁标记的线程才能访问这个代码块
       {
       ...
         }
     }

      对括号内的对象加锁,只有拿到锁标记的对象才能执行该代码块
    2.Synchronized修饰方法
       public synchronized void push(char c) {
            ...
       }
       在整个方法里,对当前对象的加锁,只有拿到锁标记的对象才能执行该方法。

  ■
    ▲ 初始状态                ▲阻塞状态          ▲终止状态
        \                  /          ┍ 1           ┓
         \                /             \ 2sleep    /
          \start        /                \ 3join   /stop
           \           /                  \       /
            ┙       ┕                    \     /
         ▲ 可运行状态  _ _ _ OS选中 _ _ _\ ▲运行状态
          (只缺CPU)    \  CPU到期或调用yield
                    ┍                        /
                      \                      /
                       \        Synchronized/
                        \                  /
                         \               ┕
                              ▲ 锁池状态
         

    锁池:一个空间,每个对象都有一个,用来存放等待锁标记的线程
    当一个对象中有了锁标记,不会释放其它对象的锁标记。

    当t1线程正在访问对象O的同步方法时,别的线程t2不能访问O的任何同步方法,但还是可以访问其它的非同步方法

  ■ ArrayList Vector
              list
            △   △
            /     \
           /       \
          /         \
      ArrayList    Vector(所有方法都做成了同步)
       
  ■ 构造方法   ×对象没有完全构造好了,没有当前对象概念
    抽象方法   ×抽象方法没有代码块,没用
    静态方法   √是对类对象的加锁
         
    ☆注意:构造方法不能Synchronized修饰
    静态方法可以用Synchronized修饰(是对类对象加锁,类对象会在反射时讲到)
    抽象方法不能用Synchronized修饰,不影响子类覆盖,子类在覆盖这个方法是可以加Synchronized,也可以不加Synchronized,所以根据Java不允许写废代码的特点是不能写在一起。


  ■ 练习:
    1、用数组实现个栈;一个线程负责入栈一个线程负责出栈;长度为6
    char[6],
    T1, Push A~Z
    T2, Pop
    长度为6,并且不允许扩充

   
-----------------
注意:对当前对象加锁,一个代码块或者方法是同步的(Synchronized),当前对象的锁标记没有分配出去时,有一个线程来访问这个代码块时,就会的到这个对象的锁标记,直到这个线程结束才会释放着个锁标记,其他想访问这个代码块或者是方法线程就会进入这个对象锁池,如果没有得到当前对象的锁标记,就不能访问这个代码块或者是方法。当一个线程想要获得某个对象锁标记而进入锁池,这个线程又持有其他对象的锁标记,那么这个线程也不会释放持有的锁标记。

注:方法的Synchronized特性本身不会被继承,只能覆盖。
线程因为未拿到锁标记而发生阻塞进入锁池(lock pool)。每个对象都有自己的一个锁池的空间,用于放置等待运行的线程。由系统决定哪个线程拿到锁标记并运行。

使用互斥锁的注意事项

举例:男孩和女孩例子,每个女孩是一个对象,每个男孩是个线程。每个女孩都有自己的锁池。每个男孩可能在锁池里等待。
Class Girl{
Public void hand(){

}
Public syncronized void kiss(){

}
}
Class Boy extends Thread{
Public void run(){

}
}

注意:只读不用加同步,只写也不用加同步,只有读写操作兼而有之时才加同步。

注意:在java.io包中Vector 和 HashTable 之所以是线程安全的,是因为每个方法都有synchronized修饰。Static 方法可以加 synchronized , 锁的是类对象。但是Vector 是 jdk 1.0 的  ArrayList 是 jdk1.2 所以实际应用还是使用ArrayList。

注意:内同步,外同步,内同步,即,类内的方法加同步(synchronized)修饰,外同步即,在需要控制只能由一个线程进行访问时,把需要控制的方法写在同步代码块里。
分享到:
评论

相关推荐

    在达内学习java的笔记

    13. **Java复习第十三天**:最后可能会讲解一些高级话题,如集合框架的高级特性和并发库(如ConcurrentHashMap、ExecutorService)的使用,或者JVM内存模型和垃圾回收机制。 通过这些复习笔记,读者可以逐步建立起...

    Java语言程序设计基础课后复习题答案第十三章

    Java 语言程序设计基础课后复习题答案第十三章 本部分内容将详细讲解 Java 语言程序设计基础课后复习题答案第十三章中的知识点。 一、Java 基础知识 1.1 在 Java 中,什么是可变长参数?答:在 Java 中,使用可变...

    java 考试复习指南

    【Java 考试复习指南】 1. Java 编译过程:Java 源程序文件(扩展名为 .java)经过Java编译器编译后,会生成字节码文件(扩展名为 .class)。这是Java程序运行的基础,因为JVM(Java虚拟机)执行的是字节码。 2. ...

    JAVA复习ppt

    这个“JAVA复习ppt”很可能是华南理工大学为了帮助学生系统复习Java编程知识而制作的教学材料。Java的特点包括跨平台性、简单性、面向对象、健壮性和安全性,这些特性使得它成为开发桌面应用、企业级应用、移动应用...

    Java语言程序设计基础第十版第十二章课后复习题答案

    根据提供的信息,我们可以总结出以下关于《Java语言程序设计基础第十版》第十二...以上是对《Java语言程序设计基础第十版》第十二章中部分复习题答案的详细解释,希望能帮助读者更好地理解Java中的异常处理及相关概念。

    java复习模拟试题

    java复习模拟试题,高质量。经典题例子,附有答案,让你收获多多,成绩稳步提高! 部分内容如下,点击下载可看全部哦!!! 6分析下面的Java程序,编译运行结果是()。(选一项) public class B{ public static ...

    java期末复习 (1)

    Java语言是在1995年由Sun Microsystems公司第一次正式发布的,James Gosling被誉为Java之父。 #### 八进制整数表示 4. **答案**:选项D。`0144`表示八进制整数,其十进制等值为100。 #### 编译错误 5. **答案**:...

    Java语言程序设计第10版(基础篇)复习题答案

    《Java语言程序设计第10版(基础篇)》是一本深入浅出的Java编程教材,旨在帮助初学者掌握这门强大的面向对象编程语言。复习题答案提供了对每一章节核心概念的检验和巩固,帮助读者确认对每个主题的理解是否到位。...

    JAVA理论知识基础复习

    十三、异常处理 JAVA中有两种异常:RuntimeException类及其子类、其他异常。RuntimeException类及其子类称为运行时异常,这种异常的特点是JAVA编译器不会检查它,即使没有用try。。。catch语句捕获它,也没有throws...

    Java考前突击复习

    Java复习材料。包括《Java技术及其应用》(第二版)(高等教育出版社)的 第6章 java语言中的面向对象特性 第7章 数组和向量 第8章 字符串处理 第10章 异常处理 第11章 输入输出处理 第13章 线程 第14\15章 ...

    java复习题库 计算机认证考试

    【Java复习题库知识点详解】 Java是一种面向对象的高级编程语言,它的主要特点包括:面向对象、跨平台、高性能和丰富的类库。在Java中,程序的基本单位是类,而不是文件,因此选项B描述错误。Java语言区分大小写,...

    java基础复习

    #### 十三、内部类 - **内部类**:可以嵌套在一个外部类中。 - 成员内部类 - 局部内部类 - 静态内部类 - 匿名内部类 以上是关于Java基础复习的知识点详解,对于理解Java的核心概念和编程实践非常重要。

    达内 corejava课程源码及每日课程复习文档

    Java标准库和许多第三方库都广泛使用注解。 11. **Lambda表达式**:自Java 8起,引入了函数式编程的概念,Lambda表达式使得编写简洁的匿名函数成为可能,简化了多线程和事件处理等场景的代码。 12. **Stream API**...

    Java软件开发基础课件+复习提纲+代码

    第13章可能涉及到更高级的话题,如多线程或者I/O流,而第4章则可能涉及类和对象的基础知识,包括封装、继承和多态。 "复习提纲.pdf" 是一个关键的学习辅助工具,它通常包含了课程的重点和难点,帮助学生系统地回顾...

    Java基础复习

    13. **多线程**:Java内置了对多线程的支持,通过Thread类或实现Runnable接口创建线程。理解和掌握线程同步机制(synchronized、wait/notify、Lock等)是解决并发问题的关键。 14. **反射机制**:Java的反射API允许...

    java语言程序设计(第八版)复习题答案

    Java语言程序设计是计算机科学领域中的重要课程,其第八版的复习题答案涵盖了广泛的Java编程概念和技术。在学习和掌握Java编程时,了解并解决这些复习题的答案对于深入理解Java的核心概念至关重要。以下是对相关知识...

    java复习文档

    根据提供的文件信息,我们可以整理出以下关键的Java知识点: ### 1. 访问修饰符 public, private, protected, default - **public**: 公有访问级别,可以在任何地方被访问。 - **protected**: 受保护访问级别,...

    java语言程序设计 梁勇 第十版答案.zip

    梁勇编著的《Java语言程序设计》第十版是一本广泛使用的教材,旨在帮助读者深入理解Java编程。这本书不仅涵盖了Java的基础知识,还包含了面向对象编程的核心理念和实践技巧。 在提供的压缩包"java语言程序设计 梁勇...

Global site tag (gtag.js) - Google Analytics