多线程虽然能够一定程度上解决高并发请求的问题,但是利用多线程进行开发,首先要保证的就是线程安全。
线程安全:无论在单线程还是多线程的情况下,业务代码输出结果不变。
同步:要实现线程安全,就需要同步,即依靠认为的调度和控制,使得业务代码按照人们意向的方向进行。
关于 Synchronized 的一些概念
对象锁:在 Java 中,每个对象都会有一个 monitor 对象,这个对象其实就是 Java 对象的锁,通常会被称为“内置锁”或“对象锁”。类的对象可以有多个,所以每个对象有其独立的对象锁,互不干扰。
类锁:在 Java 中,针对每个类也有一个锁,可以称为“类锁”,类锁实际上是通过对象锁实现的,即类的 Class 对象锁。每个类只有一个 Class 对象,所以每个类只有一个类锁。
Synchronized 用法
- this、object(对象锁)
- 类.class(类锁)
- 方法(对象锁)
- 静态方法(类锁)
生产者消费者
java多线程同步(wait、notify)生产者消费者简单示例
总结
无论 synchronized 关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
同一个类的不同对象的对象锁互不干扰
对象锁和类锁是独立的,互不干扰
synchronized 关键字不能继承,父类中的 synchronized 修饰方法,子类在覆盖该方法时,默认情况下不是同步的,必须显示的使用 synchronized 关键字修饰才行。
关键字 synchronize 拥有锁重入的功能,也就是在使用 synchronize 时,当一个线程的得到了一个对象的锁后,再次请求此对象是可以再次得到该对象的锁。