Java多线程

 

         线程方面基础知识是操作系统方面相关知识先略。

        

         什么是线程安全?

         总的来说,若一段代码在并发中运行,和在正常串行中运行,得到的结果可以确定是一样的,这段代码就是线程安全的。

 

         什么是内存可见性?

         多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现。

若在多个线程之间共享了Count类的一个对象,这个对象是被创建在主内存(堆内存)中,每个线程都有自己的工作内存(线程栈),工作内存存储了主内存Count对象的一个副本,当线程操作Count对象时,首先从主内存复制Count对象到工作内存中,然后执行代码count.count(),改变了num值,最后用工作内存Count刷新主内存Count。

当一个对象在多个内存中都存在副本时,如果一个内存修改了共享变量,其它线程也应该能够看到被修改后的值,此为可见性。

 

         使用synchronized保证操作的原子性和可见性:

  1. 使用synchronized将需要互斥的代码包含起来,并上一把锁;
    public void study(){
         synchronized(this){
              ......
         }
    }
  2. 将synchronized加在需要互斥的方法上。
    public synchronized study(){
          ... ...
    }

 

 

  获取用synchronized修饰的方法或者代码块流程:

  1. 获得同步锁;
  2. 清空工作内存;
  3. 从主存拷贝对象副本至工作内存;
  4. 执行代码;
  5. 刷新主存数据;
  6. 释放同步锁。

  每个锁对(JLS中叫monitor)都有两个队列,一个是就绪队列,一个是阻塞队列,就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程,当一个线程被唤醒(notify)后,才会进入到就绪队列,等待CPU的调度,反之,当一个线程被wait后,就会进入阻塞队列,等待下一次被唤醒。

 

  volatile的作用

  volatile是另一种Java多线程同步的机制,根据JLS(Java LanguageSpecifications)的说法,一个变量可以被volatile修饰,在这种情况下内存模型(主内存和线程工作内存)确保所有线程可以看到一致的变量值。

  并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的上一个决定时,如n=n+1、n++ 等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的。

  用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的(保证可见性不保证原子性)。

  volatile和final不能同时修饰一个字段;

 

  可用wait和notify实现生产者消费者线程协作问题。

http://blog.csdn.net/ghsau/article/details/7433673

 

  Java线程的创建的两种方式

  1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中;

  2.  通过实现Runnable接口,实例化Thread类。

 

 

 

  实现Runnable接口相对于继承Thread类来说,有如下显著的好处:

 

  (1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。

  (2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。

  (3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象是,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。

posted @ 2015-08-22 20:22  李宙你好吗  阅读(93)  评论(0)    收藏  举报