使用目的:
对多条操作共享数据语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行
防止共享数据错误
----------------------------------------------------------------
语法:
同步代码块:
synchronized(对象){需要被同步的代码/共享数据}
while(true){
Object obj=new Object();
synchronized(obj){ }
}
--------------------------------------------------------------
原理:synchronized内对象名称:锁/监视器,默认有0,1两标志位
对象如同锁,持有锁的线程可在同步代码块中执行,没有持有锁的线程
即使获取CPU执行权也进不去
eg:火车上的卫生间
-------------------------------------------------------------
同步的前提:1.两个及两个以上的线程
2.多个线程使用同一个锁
3.必须保证同步中只有一个线程在运行
好处:解决多线程安全问题
弊端:因为每次都要判断锁,会消耗资源
-----------------------------------------------------------
同步函数:
找问题:
1明确哪些代码是多线程代码
2.明确共享数据
3.明确多线程代码中哪些语句是操作共享数据
public synchronized void add(int n)
----------------------------------------------------------
问题:同步函数使用的是哪个锁
函数需要被对象调用。
那么函数都有一个所属对象,引用this
所以同步函数使用的锁是this
---------------------------------------------------------
注意:静态同步代码块,锁不是this,静态方法中不能定义this
public static synchronized
静态成员进内存时,内存中没有本类对象,但是一定有该类对应的
字节码文件对象:类名.class,即静态同步代码块使用的锁
synchronized(Demo.class)
-------------------------------------------------------