版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35638837/article/details/78545161
1.使用的是synchronized 同步代码块
SellTicketDemo2
package com.dml.demo2;
public class SellTicketDemo2 {
public static void main(String[] args) {
SellTicket mt1 = new SellTicket();
Thread th1 = new Thread(mt1,"窗口1");
Thread th2 = new Thread(mt1,"窗口2");
Thread th3 = new Thread(mt1,"窗口3");
th1.start();
th2.start();
th3.start();
}
}
SellTicket
package com.dml.demo2;
public class SellTicket implements Runnable{
private int tickets = 100;
private Object obj = new Object();
@Override
public void run() {
while(true){
synchronized (obj) {
if(tickets > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}
}
}
}
2.使用synchronized同步方法
package com.dml.demo2;
public class SellTicket implements Runnable{
private int tickets = 100;
private Object obj = new Object();
private int x = 0;
@Override
public void run() {
while(true){
if(x % 2 == 0){
//同步方法的锁对象是this
synchronized (this) {
if(tickets > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}
}else {
sell();
}
x++;
}
}
public synchronized void sell(){
if(tickets > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}
}
注意:同步方法的锁对象是this
3.使用静态的同步方法
package com.dml.demo2;
public class SellTicket implements Runnable{
private static int tickets = 100;
private Object obj = new Object();
private int x = 0;
@Override
public void run() {
while(true){
if(x % 2 == 0){
//静态同步方法的锁对象是类的字节码文件
synchronized (SellTicket.class) {
if(tickets > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}
}else {
sell();
}
x++;
}
}
public static synchronized void sell(){
if(tickets > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票");
}
}
}
注意:静态同步方法的锁对象是类的字节码文件,因为静态方法随类的加载而加载。
4.使用Lock锁方法
package com.dml.demo3;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import sun.awt.windows.ThemeReader;
public class SellTicket implements Runnable{
private int tickets = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
while(true){
try {
//获取锁
lock.lock();
if(tickets > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets -- + "张票");
}
}finally{
//释放锁
lock.unlock();
}
}
}
}
注意:Lock需要自己释放锁