多线程09线程安全问题Lock锁

lock锁

java.util.concurrent.locks.lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作。同步代码块/同步方法具有的功能lock都有,除此之外更强大更体现面向对象。

使用步骤:
1.在成员位置创建一个Reentrantlock对象
2.在可能出现安全问题的代码前调用Lock接口中的方法Lock()获取锁
3.在可能出现安全问题的代码后调用Lock接口中方法unLock() 释放锁

首先创建RunnableImp类:

package demo09线程安全lock锁;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//实现买票案例
//卖票出现了线程安全问题:卖出了不存在的票和重复的票
//使用线程安全的一种方案:lock锁
/*
java.util.concurrent.locks.lock.lock接口
Lock实现了提供了比使用synchronized方法和语句可获得更广泛的锁操作
Lock接口中的方法:
void Lock() 获取锁
void unLock() 释放锁

Reentrantlock是Lock接口的一个实现类

使用步骤:
1.在成员位置创建一个Reentrantlock对象
2.在可能出现安全问题的代码前调用Lock接口中的方法Lock()获取锁
3.在可能出现安全问题的代码后调用Lock接口中方法unLock() 释放锁

 */
public class RunnableImp implements Runnable {
    //定义一个多线程共享的票源
    private int ticket=100;
    //1.在成员位置创建一个Reentrantlock对象
    Lock L=new ReentrantLock();

    //创建一个锁对象
    Object obj=new Object();

    //定义线程任务:买票
    @Override
    public void run() {
        //使用死循环让卖票重复执行
        while(true){
            //2.在可能出现安全问题的代码前调用Lock接口中的方法Lock()获取锁
             L.lock();
                //先判断票是否存在
                if(ticket>0){
                    //为了提高安全问题出现的次数。让程序睡眠一下,输出慢一点
                    try {
                        Thread.sleep(10);
                        System.out.println(Thread.currentThread().getName()+"---正在卖票"+ticket+"张票");
                        ticket--;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally{
                        //3.在可能出现安全问题的代码后调用Lock接口中方法unLock() 释放锁
                        L.unlock();//无论程序是否出现异常,都会把锁释放掉
                    }
                 }
        }
    }
}

再创建Ticket类:

package demo09线程安全lock锁;

import demo06线程安全.RunnableImp;

//模拟买票案例,对共享的票进行出售
public class Ticket {
    public static void main(String[] args) {
        //创建接口的实现类对象
        RunnableImp run =new RunnableImp();
        //创建Thread类对象,构造方法中传递Runnable接口对象
        Thread t0=new Thread(run);
        Thread t1=new Thread(run);
        Thread t2=new Thread(run);
        //开启线程
        t0.start();
        t1.start();
        t2.start();
    }
}

结果:

 

你可能感兴趣的:(java基础知识,安全,java,开发语言)