标签: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的区别:
标签:package 方式 str star stat tle 锁定 读取 业务
原文地址:https://www.cnblogs.com/pinkman-Bjtino/p/14966604.html