package thread03;
public class TestSynBlock03 {
public static void main(String[] args) {
//一份资源
SWeb12306 web = new SWeb12306();
//多个代理
new Thread(web,"a").start();
new Thread(web,"b").start();
new Thread(web,"c").start();
}
}
class SWeb12306 implements Runnable{
//票数
private int ticketNums = 10;
private boolean flag = true;
@Override
public void run() {
while(flag) {
test5();
}
}
//线程安全: 尽可能锁定合理的范围(不是指代码 指的是数据的完整性)
//double checking 双重检测
public void test5(){
if(ticketNums<=0) {//考虑的是没有票的情况
flag = false;
return;
}
synchronized (this) {
if(ticketNums<=0) {//考虑的是最后一张票的情况
flag = false;
return;
}
//模拟网络延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
}
}
//线程不安全 范围太小 锁不住
public void test4(){
synchronized (this) {
if(ticketNums<=0) {
flag = false;
return;
}
}
//模拟网络延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
}
//线程不安全 ticketNums对象在变
public void test3(){
synchronized ((Integer)ticketNums) {
if(ticketNums<=0) {
flag = false;
return;
}
//模拟网络延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
}
}
//线程安全 范围太大 效率低下
public void test2(){
synchronized (this) {
if(ticketNums<=0) {
flag = false;
return;
}
//模拟网络延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
}
}
//线程安全 同步方法
public synchronized void test(){
if(ticketNums<=0) {
flag = false;
return;
}
//模拟网络延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
}
}
多线程 线程安全(synchronized)同步方法 同步块
最新推荐文章于 2022-03-04 15:05:47 发布