synchronized和lock

    技术2022-07-11  122

    synchronized:

    **github地址:**https://github.com/lishanglei/thread-demo.git

    同步实例方法锁的对象为this,即当前实例对象
    同步静态方法锁的对象为类对象,即Student.class

    ​ 多个线程同时操作一个实例,synchronized可以锁this对象,因为只有一个实例,在所有锁中是唯一的.

    @Test public void test4() { Ticket ticket = new Ticket(); //一个实例,三个线程 FutureTask futureTask1 = new FutureTask(ticket); FutureTask futureTask2 = new FutureTask(ticket); FutureTask futureTask3 = new FutureTask(ticket); Thread t1 = new Thread(futureTask1,"窗口一"); Thread t2 = new Thread(futureTask2,"窗口二"); Thread t3 = new Thread(futureTask3,"窗口三"); t1.start(); t2.start(); t3.start(); }

    ​ 多个线程同时操作多个实例,synchronized必须锁静态变量,因为有多个实例,只有静态变量在多个线程中共用的是唯一的

    @Test public void test5(){ Ticket ticket1 = new Ticket(); Ticket ticket2 = new Ticket(); FutureTask futureTask1 = new FutureTask(ticket1); FutureTask futureTask2 = new FutureTask(ticket2); Thread t1 = new Thread(futureTask1,"窗口一"); Thread t2 = new Thread(futureTask2,"窗口二"); t1.start(); t2.start(); }

    Lock:

    public class Ticket implements Callable<String> { //票的数量 private int ticket = 20; private Lock lock = new ReentrantLock(); //lock的实现类 @Override public String call() { while (true) { lock.lock(); //加锁 try { if (ticket == 0) { System.out.println(Thread.currentThread().getName() + "票卖完了"); break; } else { System.out.println(Thread.currentThread().getName() + " 在卖票,还剩下 " + --ticket); } } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); //释放锁 } } return "票卖完了"; } }

    线程死锁:锁的嵌套

    public static void main(String[] args) { Object a=new Object(); Object b=new Object(); new Thread(()->{ while (true){ //不停的过马路 synchronized (a){ synchronized (b){ System.out.println("小康同学正在过马路"); } } } }).start(); new Thread(()->{ while (true){ //不停的过马路 synchronized (b){ synchronized (a){ System.out.println("小薇同学正在过马路"); } } } }).start(); }

    Processed: 0.012, SQL: 9