宝藏UP主狂神说JAVA笔记
卖票问题不加锁
public class TicketSaleDemo_1 {
public static void main(String[] args) {
// 并发:多线程操作同一共享资源
Ticket ticket = new Ticket();
new Thread(() -> {for (int i = 0; i < 50; i++) ticket.sale();}, "A").start();
new Thread(() -> {for (int i = 0; i < 50; i++) ticket.sale();}, "B").start();
new Thread(() -> {for (int i = 0; i < 50; i++) ticket.sale();}, "C").start();
}
}
// 资源类 OOP
class Ticket {
// 属性 方法
private int num = 30;
public void sale() {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "还剩" + num--);
}
}
}
A还剩30
A还剩29
A还剩27
B还剩28
B还剩25
B还剩24
B还剩23
B还剩22
B还剩21
B还剩20
A还剩26
A还剩18
A还剩17
A还剩15
A还剩14
A还剩13
A还剩12
A还剩11
A还剩10
A还剩9
A还剩8
A还剩7
A还剩6
A还剩5
A还剩4
A还剩3
B还剩19
B还剩1
A还剩2
C还剩16
卖票问题加Synchronized锁
public class TicketSaleDemo_2 {
public static void main(String[] args) {
// 并发:多线程操作同一共享资源
Ticket2 ticket2 = new Ticket2();
new Thread(() -> {for (int i = 0; i < 50; i++) ticket2.sale();}, "A").start();
new Thread(() -> {for (int i = 0; i < 50; i++) ticket2.sale();}, "B").start();
new Thread(() -> {for (int i = 0; i < 50; i++) ticket2.sale();}, "C").start();
}
}
class Ticket2 {
// 属性 方法
private int num = 30;
public synchronized void sale() {
if(num > 0) {
System.out.println(Thread.currentThread().getName() + "还剩" + num--);
}
}
}
A还剩30
A还剩29
A还剩28
A还剩27
B还剩26
B还剩25
B还剩24
A还剩23
A还剩22
A还剩21
A还剩20
A还剩19
A还剩18
A还剩17
A还剩16
A还剩15
A还剩14
A还剩13
A还剩12
A还剩11
A还剩10
A还剩9
A还剩8
A还剩7
A还剩6
A还剩5
A还剩4
A还剩3
A还剩2
A还剩1
卖票问题加Lock锁
// Lock三部曲
// 1.创造锁 new ReentrantLock();
// 2.加锁 lock.lock();
// 3. finally 释放锁 lock.unlock();
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TicketSaleDemo_3 {
public static void main(String[] args) {
Ticket3 ticket3 = new Ticket3();
new Thread(() -> {for (int i = 0; i < 50; i++) ticket3.sale();}, "A").start();
new Thread(() -> {for (int i = 0; i < 50; i++) ticket3.sale();}, "B").start();
new Thread(() -> {for (int i = 0; i < 50; i++) ticket3.sale();}, "C").start();
}
}
// Lock三部曲
// 1.创造锁 new ReentrantLock();
// 2.加锁 lock.lock();
// 3. finally 释放锁 lock.unlock();
class Ticket3 {
private int num = 30;
Lock lock = new ReentrantLock();
public void sale() {
lock.lock();
try {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "还剩" + num--);
}
}catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
A还剩30
A还剩29
A还剩28
A还剩27
A还剩26
A还剩25
C还剩24
C还剩23
C还剩22
C还剩21
C还剩20
C还剩19
C还剩18
C还剩17
C还剩16
C还剩15
C还剩14
C还剩13
C还剩12
C还剩11
C还剩10
C还剩9
C还剩8
C还剩7
C还剩6
C还剩5
C还剩4
C还剩3
C还剩2
C还剩1