java同步机制的几种方式
出现线程安全问题:
如果存在多个线程对共享资源竞争,就可能发生线程安全问题。
一般解决线程安全问题,需要➕锁
1. synchronized同步方法
对于非static方法加上synchronized,是对当前对象加锁。而如果对static方法加上synchronized关键字,是对当前类对象-class对象加锁。
1. 如果一个线程访问一个对象的synchronized方法,那么其它线程不能访问该对象的synchronized方法。
2. 但是其它线程可以访问这个对象的非synchronized方法。
3. 当然,对于一个类的不同实例之间互不影响。
4. 如果一个线程执行一个对象的非static synchronized方法,另外一个线程执行这个对象所属类的static synchronized方法,不会互斥。因为一个是对象锁,一个是类锁。
5. 对于synchronized同步代码块或者同步方法,当出现异常的时候,虚拟机会自动释放当前线程占用的锁,因此不会出现由于异常导致出现死锁现象。
synchronized原理
对于同步代码块用javap -c com.demo.synchronzeddemo反编译成字节码的时候,会在同步块的入口和出口分看到monitorenter,monitorexit ,这两个指令。
其实对于每个对象都有一个监视器锁,monitor,当monitor被占用的时候就会处于锁定状态,线程执行monitorenter的时候会尝试获取monitor的所有权。
1. 如果monitor的进入数为0,则该线程进入mo