The difference between Synchronized and Lock
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Ticket{
private int number = 30;
private Lock lock = new ReentrantLock();
public void sale(){
lock.lock();
try{
if(number > 0){
System.out.println(Thread.currentThread().getName() + "\t卖出了" + (number--) + "还有" + number + "张");
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
public class Demo07 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(()->{for (int i = 0; i < 40; i++) ticket.sale(); },"A").start();
new Thread(()->{for (int i = 0; i < 40; i++) ticket.sale(); },"B").start();
new Thread(()->{for (int i = 0; i < 40; i++) ticket.sale(); },"C").start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// for (int i = 0; i < 40; i++) {
// ticket.sale();
// }
// }
// },"A").start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// for (int i = 0; i < 40; i++) {
// ticket.sale();
//
// }
// }
// },"B").start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// for (int i = 0; i < 40; i++) {
// ticket.sale();
//
// }
// }
// },"C").start();
}
}
What is a lock and how to judge a lock
The most basic producer consumer
public class Demo09 {
public static void main(String[] args) {
Data data = new Data();
new Thread(()->{for (int i = 0;i < 10;i++) {
try {
data.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(()->{for (int i = 0;i < 10;i++) {
try {
data.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
}
}
class Data{
private int number = 0;
public synchronized void increment() throws InterruptedException {
if(number != 0){
this.wait();
}
number ++;
System.out.println(Thread.currentThread().getName() + "=>" + number);
this.notifyAll();
}
public synchronized void decrement() throws InterruptedException {
if(number == 0){
this.wait();
}
number--;
System.out.println(Thread.currentThread().getName() + "=>" + number);
this.notifyAll();
}
}
If there are more than two threads, then
if is changed to while
public class Demo09 {
public static void main(String[] args) {
Data data = new Data();
new Thread(()->{for (int i = 0;i < 10;i++) {
try {
data.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(()->{for (int i = 0;i < 10;i++) {
try {
data.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
new Thread(()->{for (int i = 0;i < 10;i++) {
try {
data.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"C").start();
new Thread(()->{for (int i = 0;i < 10;i++) {
try {
data.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"D").start();
}
}
class Data{
private int number = 0;
public synchronized void increment() throws InterruptedException {
while (number != 0){
this.wait();
}
number ++;
System.out.println(Thread.currentThread().getName() + "=>" + number);
this.notifyAll();
}
public synchronized void decrement() throws InterruptedException {
while (number == 0){
this.wait();
}
number--;
System.out.println(Thread.currentThread().getName() + "=>" + number);
this.notifyAll();
}
}