安卓java文件锁住_Android-Java-synchronized静态方法&字节码文件对象

上一篇博客 Android-Java-同步方法-synchronized,中讲解了普通方法加入synchronized修饰符,此synchronized的同步锁是this,还介绍方法的封装性,这篇博客就不讲方法的封装性了

先看一个 静态方法加入修饰符synchronized(案例)

packageandroid.java.thread12;/*** 售票业务*/

classBooking {/*** 模拟票的总算 10张票*/

private static int ticket = 10;/*** 加入了同步修饰符的方法synchronized,

* 不管CPU如何疯狂的切换执行,

* 只要同步方法里面的代码没有执行完,

* 就不准其他线程进来执行

* 这样就保证了多线程操作共享数据的安全性*/

public static synchronized void actionTicket() { //synchronized同步操作共享数据的代码//synchronized (BookingRunnable.class) {

if (ticket > 0) {//让线程在这里停一下,会更加容易复现线程的安全问题,就算不加这行代码,安全问题依然有

try{

Thread.sleep(200);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println("名称:" + Thread.currentThread().getName() + "窗口卖出第" + ticket + "张票");

ticket--;

}//}

}

}/*** 售票任务*/

class BookingRunnable implementsRunnable {

@Overridepublic voidrun() {while (true) {

Booking.actionTicket();

}

}

}/*** 售票案例*/

public classBookingTest {public static voidmain(String[] args) {/*** 定义Runnable实现类Booking,此实现类Booking不是线程,此实现类Booking给四个Thread去执行的*/Runnable booking= newBookingRunnable();//实例化线程对象

Thread thread1 = new Thread(booking); //此实现类Booking给Thread去执行的

Thread thread2 = new Thread(booking); //此实现类Booking给Thread去执行的

Thread thread3 = new Thread(booking); //此实现类Booking给Thread去执行的

Thread thread4 = new Thread(booking); //此实现类Booking给Thread去执行的//开启启动线程

thread1.start(); //启动第Thread-0窗口 执行卖票任务

thread2.start(); //启动第Thread-1窗口 执行卖票任务

thread3.start(); //启动第Thread-2窗口 执行卖票任务

thread4.start(); //启动第Thread-3窗口 执行卖票任务

}

}

执行结果:

58ff952584649b5da4f5134be5706787.gif

静态方法加入synchronized修饰符后,同步静态方法的🔒锁机制-->   锁🔒是当前类名.class

伪代码:>>>>> 静态方法同步的锁🔒是 == 当前类名.class    其实 (当前类名.class)就是字节码文件对象

public static synchronized(锁🔒是 当前类名.class) voidactionTicket() {//.....

}

真实代码:

public static synchronized void actionTicket() { //synchronized同步操作共享数据的代码//synchronized (BookingRunnable.class) {

if (ticket > 0) {//让线程在这里停一下,会更加容易复现线程的安全问题,就算不加这行代码,安全问题依然有

try{

Thread.sleep(200);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println("名称:" + Thread.currentThread().getName() + "窗口卖出第" + ticket + "张票");

ticket--;

}//}

}

字节码文件对象 的描述 就是对类的类描述>>>Class

字节码文件对象,内存图:

d414d710ab2689a8714e68cd5abd25b8.png

public synchronized void 方法名(){} , 这种方式的同步锁🔒是 this,当前对象,是对象创建后才会有的 b = new 对象();,b也属于当前对象

public synchronized static void 方法名{},这种方式的同步锁🔒是以上图的(字节码文件对象),当前类的(字节码文件对象),当类加载进内存,就会产生(字节码文件对象);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值