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

------- <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();
 }
}























 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值