zoukankan      html  css  js  c++  java
  • 线程同步的三种方式

    线程同步的三种方式

      1. 同步代码块。

      2. 同步方法。

      3. 锁机制。 

    同步代码块: synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。

      synchronized(同步锁){

          需要同步操作的代码

      }

      同步锁:
      对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁.

        1. 锁对象 可以是任意类型。

        2. 多个线程对象 要使用同一把锁。

    /**
    * 同步代码块
    */
    public class Ticket implements Runnable {
    private int ticket = 100;

    Object lock=new Object();

    @Override
    public void run() {
    while(true){
    synchronized(lock){
    if (ticket>0){
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+" 正在卖:"+ticket--+"张票!");
    }
    }
    }
    }

    }

    同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外 等着。 

       public synchronized void method(){

            可能会产生线程安全问题的代码

         } 

    /**
    * 同步方法
    */
    public class Ticket01 implements Runnable {
    private int ticket = 100;

    @Override
    public void run() {
    while(true){
    sellTicket();
    }
    }
    public synchronized void sellTicket(){
    if (ticket>0){
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+" 正在卖:"+ticket--+"张票!");
    }
    }
    }

    对于非static方法,同步锁就是this。

    对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。

    Lock锁机制:java.util.concurrent.locks.Lock 机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作, 同步代码块/同步方法具有的功能Lock都有,

       除此之外更强大,更体现面向对象。 Lock锁也称同步锁,加锁与释放锁方法化了,如下:

    • public void lock() :加同步锁。
    • public void unlock() :释放同步锁  
    /**
    * Lock锁机制
    */
    public class Ticket02 implements Runnable {
    private int ticket = 100;
    Lock lock = new ReentrantLock();
    @Override
    public void run() {
    while(true){
    lock.lock();
    if (ticket>0){
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+" 正在卖:"+ticket--+"张票!");
    }
    lock.unlock();
    }
    }
    }


  • 相关阅读:
    用sql合并列,两句话合为一句
    微信公众平台中添加qq在线聊天代码
    我被7岁4岁的小姐妹狠狠教训了一番
    Yahoo News Digest(雅虎新闻摘要)APP的推出,未来的seo界又要受伤了
    新浪微博@别人字母不分大小写(微博昵称不分大小写)
    最近打算体验一下discuz,有不错的结构化数据插件
    使用css3来实现边框圆角效果
    用WP_Query自定义WordPress 主循环
    关闭火车头dedecms发布模块自动关键词,解决火车头发布dedecms文章关键词过多问题
    dedecms发布文章时多个Tag间分割逗号自动变成英文逗号
  • 原文地址:https://www.cnblogs.com/lifengSkt/p/13269738.html
Copyright © 2011-2022 走看看