黑马程序员—java技术blog—第十五篇线程同步机制概述与简单应用

来源:互联网 发布:qq防撤回软件 编辑:程序博客网 时间:2024/06/01 09:12
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
同步机制的实现方式:
 * 1, 同步代码块
 * 格式:
 * synchronized(锁对象) {
 * 可能出现线程不同步问题的代码
 * }
 * 这里的锁对象,可以是任何创建的对象
 *
 * 2, 同步方法
 * 普通同步方法
     public synchronized void method(){}
 *
 * 静态同步方法
     public static synchronized void method(){}
---------------------------------------------------------------------------
 
   多个售票员一起卖电影票案例
 *
 * 票 class Ticket
 * 售票员 (线程)
 * 
   发现模拟真实卖票出现的问题
 * 1,重复的票
 * 2,负数的票
 *
 * -----------------------
 * 解决上述的问题
 * 通过线程的同步机制来解决问题
 * 线程的同步机制 就是 保证线程安全
 *
 * 线程安全 -- 线程同步  -- Vector
 * 线程不安全 -- 线程不同步 -- ArrryList
 *
---------------------------------------------
满足哪些条件,会导致线程不同步?----------------多个售票员卖同一张票,即线程不同步,冲突了
 1, 多线程环境
 2,多个线程对象,操作同一个数据 (票)
 3,对共享数据(票), 进行了一步以上的操作
 
如何解决上述问题呢?
 3,对共享数据(票), 进行了一步以上的操作
 通过java中的同步机制,将与票相关的操作封装起来,同一时刻,只能有一个线程对象访问,这样,该问题解决了
-----------------------------------------------

同步方法的锁对象 是谁?
 1,同步代码块: 锁对象是任意的,但是多个线程必须使用同一把锁------同步方法中也是
 
 2,同步方法的锁对象是 this
 
 3,同步静态方法的锁对象是   类名.class  
  Ticket.class
  字节码文件对象

------------------------------------------------
死锁在同步方法、同步代码块嵌套使用的时候,可能产生的一种异常现象[无限等待]

------------------------------------------------
Lock : 锁, jdk1.5
 public interface Lock
  实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作
 
 方法:
  void lock()获取锁。
  void unlock()释放锁。

-------------------------------------------------
匿名内部类方式使用多线程
 new Thread(){
  public void run(){
   code...
  }
 }.start();
 ------------
 
 new Thread(new Runnable(){
  public void run(){
   code...
  }
 }).start();

同步机制的应用:

  同步机制的实现方式:
 * 1, 同步代码块
 * 格式:
 * synchronized(锁对象) {
 * 可能出现线程不同步问题的代码
 * }
 * 这里的锁对象,可以是任何创建的对象
 *
 * 2, 同步方法
 * 普通同步方法
     public synchronized void method(){}
 *
 * 静态同步方法
     public static synchronized void method(){}
 
---------------------------------------------
满足哪些条件,会导致线程不同步?
 1, 多线程环境
 2,多个线程对象,操作同一个数据 (票)
 3,对共享数据(票), 进行了一步以上的操作
 
如何解决上述问题呢?
 3,对共享数据(票), 进行了一步以上的操作
 通过java中的同步机制,将与票相关的操作封装起来,同一时刻,只能有一个线程对象访问,这样,该问题解决了
-----------------------------------------------

同步方法的锁对象 是谁?
 1,同步代码块: 锁对象是任意的,但是多个线程必须使用同一把锁
 
 2,同步方法的锁对象是 this
 
 3,同步静态方法的锁对象是   类名.class  
  Ticket.class
  字节码文件对象

案例:
   多个售票员一起卖电影票案例
 *
 * 票 class Ticket
 * 售票员 (线程)
 * 
   发现模拟真实卖票出现的问题
 * 1,重复的票
 * 2,负数的票
 *
 * -----------------------
 * 解决上述的问题
 * 通过线程的同步机制来解决问题
 * 线程的同步机制 就是 保证线程安全
 *
 * 线程安全 -- 线程同步  -- Vector
 * 线程不安全 -- 线程不同步 -- ArrryList
 *
 * --------------------------
 * 同步机制的实现方式:
 * 1, 同步代码块
 * 格式:
 * synchronized(锁对象) {
 * 可能出现线程不同步问题的代码
 * }
 * 这里的锁对象,可以是任何创建的对象
 *
 * 2, 同步方法
 * 普通同步方法
 *
 * 静态同步方法

方式1:           
  多个售票员一起卖电影票案例           票 class Ticket         售票员 (线程)

方式2:  多个售票员一起卖电影票案例           票 class Ticket         售票员 (线程)

方式3:  多个售票员一起卖电影票案例           票 class Ticket         售票员 (线程)
  
   注意静态方法时,成员变量也改成静态的


方式4:多个售票员一起卖电影票案例           票 class Ticket         售票员 (线程)
 Lock : 锁, jdk1.5
 public interface Lock
  实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作
 
 方法:
 void lock()获取锁。
 void unlock()释放锁。 


 匿名内部类方式使用多线程
 new Thread(){
  public void run(){
   code...
  }
 }.start();
 ------------
 
 new Thread(new Runnable(){
  public void run(){
   code...
  }
 }).start();
 */
例:
public class InnerClassThread {
 public static void main(String[] args) {
  匿名内部类方式使用多线程
  /*
  for (int i = 0; i < 3; i++) { ------------------------------创建了3个线程
   new Thread(){
    重写run方法
    public void run() {
     for (int i = 0; i < 10; i++) {
      System.out.println(i);
     }
    };
   }.start();
  }
  */
 
  匿名内部类方式使用多线程
  new Thread(new Runnable(){ --------------------新建了一个1个线程
   public void run(){
    for (int i = 0; i < 10; i++) {
     System.out.println(i);
    }
   }
  }).start();
 }
}























 

0 0
原创粉丝点击