• 线程同步的三种方式


    线程同步的三种方式

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


  • 相关阅读:
    精简的网站reset 和 css通用样式库
    bootstrap使用心得及css模块化的初步尝试
    如何更高效地定制你的bootstrap
    OOCSS的概念和思路
    圣杯布局和双飞翼布局的作用和区别
    espcms简约版的表单,提示页,搜索列表页
    Sublime快捷键
    JavaScript——理解闭包及作用
    JavaScript——基本的瀑布流布局及ajax动态新增数据
    JavaScript——之对象参数的引用传递
  • 原文地址:https://www.cnblogs.com/lifengSkt/p/13269738.html
Copyright © 2020-2023  润新知