码迷,mamicode.com
首页 > 其他好文 > 详细

Synchronized和Lock

时间:2021-07-05 18:23:51      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:package   方式   str   star   stat   tle   锁定   读取   业务   

模拟多个线程同时买票

package com.JUC;

//基本买票
/*
线程就是一个单独的资源类,没有任何附属操作
* */
public class SynchronizedDemo1 {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(()->{
            for (int i = 0; i <60 ; i++) {
                ticket.sale();
            }
            },"A").start();
        new Thread(()->{for (int i = 0; i <60 ; i++) {
            ticket.sale();
        }
        },"B").start();
        new Thread(()->{for (int i = 0; i <60 ; i++) {
            ticket.sale();
        }
        },"C").start();
    }
}

//资源类 OOP
class Ticket{
    private int number = 50;

    //买票的方式
    public void sale(){
        if (number>0){
            System.out.println(Thread.currentThread().getName()+"还剩:"+(number--)+"张票");
        }
    }
}

 这样多个线程会争夺同一个资源,造成数据有问题,加入synchronized可以解决这个问题

class Ticket{
    private int number = 50;

    //买票的方式
    public synchronized void sale(){
        if (number>0){
            System.out.println(Thread.currentThread().getName()+"还剩:"+(number--)+"张票");
        }
    }
}

 

Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。

锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如 ReadWriteLock 的读取锁。

用lock达到多线程的操作:

package com.JUC;

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

//基本买票
/*
线程就是一个单独的资源类,没有任何附属操作
* */
public class LockDemo02 {
    public static void main(String[] args) {
        Ticket2 ticket2 = new Ticket2();
        new Thread(()->{
            for (int i = 0; i <60 ; i++) {
                ticket2.sale();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i <60 ; i++) {
                ticket2.sale();
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i <60 ; i++) {
                ticket2.sale();
            }
        },"C").start();
    }
}

//lock三部曲 1、new ReentrantLock 2、加锁  3、解锁
class Ticket2{
    private int number = 50;
    Lock lock = new ReentrantLock();

    public void sale(){
        lock.lock();//加锁

        try {
            //业务代码
            if (number>0){
                System.out.println(Thread.currentThread().getName()+"还剩:"+(number--)+"张票");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();//解锁
        }
    }
}

synchronized和lock的区别:

  • Synchronized是java内置的关键字,Lock是一个java类
  • Synchronized无法判断获取锁的状态,Lock可以判断是否获取到了锁
  • Synchronized会自动释放锁,Lock必须手动释放锁,否则会死锁
  • Synchronized线程1获得锁后阻塞,其他线程会一直等,Lock不一定会,有个trylock方法会尝试获取锁。
  • lock锁可以自己设置公平还是非公平,默认是非公平

 

Synchronized和Lock

标签:package   方式   str   star   stat   tle   锁定   读取   业务   

原文地址:https://www.cnblogs.com/pinkman-Bjtino/p/14966604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!