多线程在同一时间内对同一资源(变量,代码块,数据等)进行访问,可能会出现线程同步的问题;
锁机制synchronized关键字
可以用来修饰方法或者代码块
提高代码的安全性,但是会降低性能
同步方法语法:
public synchronized 修饰符 方法名(。。){。。。}
当第一个线程进入后,会自动上锁,其它的线程就访问不了了,当前面的线程执行完成后,会自动释放锁,其它的线程就可以访问了。
同步代码块它是声明在方法内的
语法:
public 返回值类型 方法名(){
synchronized(对象实例){
需要上锁的代码块}
}
锁的对象:
①任意的java对象都可以作为synchronized关键字所需要的实例
②不能是局部变量
总结:同步方法和同步代码块的区别:
1,声明的位置不同:同步方法声明在方法上,同步代码块在方法内;
2,锁的粒度不同:同步方法的锁粒度比较大,同步代码块较小;
3,效率不同:同步方法的效率略低
4,锁对象不同:同步方法的锁对象是固定,静态的就是当前类.class,非静态就是this,
同步代码块的锁对象是可以指定的
关键字synchronied的实现原理:
通过监视器monitor实现:
它的内部监视器有一个计数器,默认是0,当一个线程进入后会+1.当下一个进程来时,计数器为1,监视器不允许进入,当前一个线程执行完退出后,计数器-1,当其它线程来访问时,计数器为0 ,监视器允许进入。



