多线程函数引用的锁为this
同步函数:函数上加同步修饰关键字
同步函数使用的锁:函数需要被对象调用,哪个对象不确定 就用this来表示
同步函数使用的锁就是this
public synchronized void run() {
while (tacket>0)
{
System.out.println("线程销售: "+Thread.currentThread().getName()+"销售票次: "+tacket);
tacket--;
}
}
静态多线程函数
static方法随着类加载,这时不一定有该类对象,但一定有该类的字节码对象
这个对象简单的表示为类名.class
即静态多线程函数的引用锁为字节码对象
class Tacket implements Runnable
{ private static int tacket=1000;
boolean flog=true;
Object object=new Object();
@Override
public void run() {
if (flog) {
synchronized (object) {
while (tacket > 0)
System.out.println(Thread.currentThread().getName() +"同步代码块"+ "剩余数" + tacket--);
}
}
else{sale();}
}
public static synchronized void sale(){
while (tacket > 0)
System.out.println(Thread.currentThread().getName() +"同步方法"+ "剩余数" + tacket--);
}
}
public class SaleTacket {
public static void main(String[] args) throws InterruptedException {
//线程任务对象
Tacket tacket=new Tacket();
Thread t1=new Thread(tacket,"线程1");
Thread t2=new Thread(tacket,"线程2");
t1.start();
Thread.sleep(2);
tacket.flog=false;
t2.start();
}
}
不同锁无法实现同步
结果:
线程2同步方法剩余数3
线程2同步方法剩余数2
线程2同步方法剩余数1
线程1同步代码块剩余数0
将
synchronized (SaleTacket.class) {
while (tacket > 0)
System.out.println(Thread.currentThread().getName() +"同步代码块"+ "剩余数" + tacket--);
}
和静态同步方法同锁
同步函数和同步代码块区别:
同步函数只能使用this锁
同步代码块可以使用任意对象锁
如果一个类中只需要一个锁,这时可以考虑同步函数,使用this,写法简单
如果一个类中需要多个锁,或者多个函数中需要用同一个锁,就使用同步代码块
网友评论