多线程-线程安全问题-lock锁
lock锁
lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作
同步代码块/同步方法具有的功能lock都有 除此之外更强大 更体面面向对象
lock隶属于java.util.concurrent.locks包下
lock锁也称为同步锁 加锁与释放锁方法化
public void lock():加同步锁
public viud unlock():释放同步锁
使用步骤:
1.在成员位置创建一个ReentrantLock对象
2.在可能会出现安全问题的代码前调用lock接口中的方法lock获取锁
3.在可能会出现安全问题的代码后嗲用lock接口中的方法unlock释放锁
代码:
public class DemoLock implements Runnable {
    //定义一个多个线程共享的票源
    private static int ricket=100;
   //创建锁对象
   Lock l=new ReentrantLock();
    //设置线程任务:卖票
    @Override
    public void run() {
        //使用死循环 让卖票操作重复执行
        while (true){
            l.lock();
            //加入线程休眠
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            l.unlock();
            //先判断票是否存在
            if (ricket==0){
                break;
            }
            //票存在 买票 ticket--
            System.out.println(Thread.currentThread().getName()+"--->正在买第"+ricket+"张票");
            ricket--;
        }
    }
}
class test09{
    public static void main(String[] args) {
        //创建实现类对象
        DemoLock ticket = new DemoLock();
        //实现线程执行
        /*
          因为有两张售票口所有要进行出售
         */
        new Thread(ticket).start();
        new Thread(ticket).start();
    }
}
运行结果:

线程状态
线程创建并启动以后 它既不是一启动就进入执行状态 也不是处于执行状态 在线程的生命周期中 有六种线程状态
- NEW
 - 至今尚未启动的线程处于这种状态
 
- RUNNABLE
- 正在java虚拟机中执行的线程处于这种状态
 
- BLOCKED
- 受阻塞并等待某个监视器锁的线程处于这种状态
 
- WAITING
- 无限期地等待另一个线程来执行某一特定操作的线程处于这种状态
 
- INMED_WAITING
- 等待另一个线程来执行取决于指定等待时间操作的线程处于这种状态
 
- TERMINATED
- 已退出的线程处于这种状态
 
图解:

 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号