一、介绍
synchronized 同步方法就是将synchronized 关键字加到方法里
格式:权限修饰符 synchronized 返回值类型 方法名(方法参数){
}
特点:1. 同步方法是锁住方法里面所有的方法
2. 锁对象不能自己指定 如果是非静态:this 如果是静态:当前类的字节码文件对象
/*
需求:3个售票窗口卖100张票
利用同步方法来解决
技巧:先写同步代码块 再将里面的代码抽取到方法就行了
*/
二、代码展示
D1类
package huang7;
public class D1 {
public static void main(String[] args) {
/*
需求:3个售票窗口卖100张票
利用同步方法来解决
技巧:先写同步代码块 再将里面的代码抽取到方法就行了
*/
Myrunable m1 = new Myrunable();
Thread t1 = new Thread(m1, "窗口1");
Thread t2 = new Thread(m1, "窗口2");
Thread t3 = new Thread(m1, "窗口3");
t1.start();
t2.start();
t3.start();
}
}
测试类
/*
* Copyright (c) 2020, 2023, webrx.cn All rights reserved.
*
*/
package huang7;
public class Myrunable implements Runnable {
/*
因为这是第二种创建方式,只会创建一次本类对象 所以不需要加static方法
*/
int ticket = 0;//0-99
@Override
public void run() {
while (true) {
if (m()) break;
/*
当synchronized方法执行完毕后要让该线程睡眠一下和其他线程重新争夺cpu的使用权否则会因为锁的原因别的进程进不去
*/
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
//方法是非静态的 锁对象为 this 按下 Ctrl Alt M 会自动的将代码块封装为方法
private synchronized boolean m() {
if (ticket < 100) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
ticket++;
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
} else {
return true;
}
return false;
}
}
三、运行结果展示