多线程(七)---多线程同步相关问题
(一)同步机制
同步:多线程情况下只保证一次只有一个线程在执行,其他线程进不来,这就是同步机制
好处:解决了多线程的安全问题
弊端:减低效率
(二)同步前提
问:多线程安全问题出现后,加了同步机制依旧有问题,如何解决?
答:问题原因,不是同一个锁导致的
同步的前提:多线程在同步必须使用同一个锁,这才是多线程的同步
错误代码
public void run(){ while (true){ synchronized (new Object()){ // 每个线程都使用的自己的锁,导致问题发生 if (tickets>0){ System.out.println(Thread.currentThread().getName()+"------tickets:"+tickets--); } } } }
(三)同步注意点
多线程同步要分清需要同步的代码,切记不要随意添加synchronized(obj)
(四)同步函数
1)、分析多线程是否存在安全隐患?
1.线程中是否有共享数据。
2.是否有多条线程操作共享数据。
2)、同步函数:其实就是在函数上加上了同步关键字进行修饰
3)、同步的表现形式有两种:1.同步代码块 2.同步函数
(五)同步函数使用的锁是什么呢?函数需要被对象调用,那个对象不确定,但是都用this来表示
同步函数使用的锁就是this.
验证同步函数使用的是this。验证需求:启动两个线程。
1:一个线程负责执行同步代码块(使用明锁)
2:一个线程负责执行同步函数(使用this)
两个线程执行相同线程任务,如果他们没有相同的锁,说明他们没有同步,会出现数据错误
错误代码演示:
正确代码演示:
(六)验证statci同步函数锁是类名.class
如果同步函数被static修饰呢?
1、static随着类的加载,这时不一定有该类的对象,但是,一定有该类的字节码文件对象
2、这个对象简单的表现形式:类名.class
正确代码演示: