package com.huowolf;
/*
* 有必要加锁的前提是:有多个线程对同一数据进行多行代码操作。
* 检查方法是,1.先找出多个线程执行了那些代码块。
* 2.这些代码中有没有共同(或共享)数据。
* 3.操作该共同数据的代码是否有多行。
* 如果以上三条都满足的话。则必须要加锁(也就是同步代码块或者同步函数)。
*
*
* 同步函数用的哪一个锁?
* 函数需要被对象调用,那么函数都有一个所属对象引用,就是this.
* 所以同步函数使用的锁是this
*
* 同步函数被静态修饰后,使用的锁是什么那?
* 使用静态方式,内存中没有本类对象,但是一定有该类对应的字节码文件对象
* 类名.class 该对象的类型是Class
* 静态的同步方法,使用的锁是该方法所在类的字节码文件对象。即 类名.class
*/
class Ticket implements Runnable {
private int ticket =100;
boolean flag =true;
@Override
public void run() {
if(flag) {
while(true) {
//同步代码块
synchronized (this) {
if(ticket>0) {
try {Thread.sleep(10); } catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"代码块..."+ticket--);
}
}
}
}
else{
while(true){ show();}
}
}
//同步函数
public synchronized void show() {
if(ticket>0) {
try {
Thread.sleep(10);
} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"函数..."+ticket--);
}
}
}
public class ThisLockDemo {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
//让主线程睡眠一小会,让t1线程先执行
try {Thread.sleep(10); } catch (Exception e) {}
t.flag = false;
t2.start();
}
}
对多线程的锁的理解
最新推荐文章于 2022-06-22 13:53:05 发布