版权声明:版权归 爱装逼的文艺小青年所有 https://blog.csdn.net/toyota_rav4/article/details/85206387
使用同步方法的过程中容易 造成无限期等待的问题,可以使用同步代码块来解决。
package com.demo2;
public class MyObject {
synchronized public void methodA(){
System.out.println("methodA begin");
boolean flag = true;
while(flag){
}
System.out.println("methodA end");
}
synchronized public void methodB(){
System.out.println("methodB begin");
System.out.println("methodB end");
}
}
package com.demo2;
public class ThreadA extends Thread {
private MyObject myObject;
public ThreadA(MyObject myObject) {
this.myObject = myObject;
}
@Override
public void run() {
myObject.methodA();
}
}
package com.demo2;
public class ThreadB extends Thread {
private MyObject myObject;
public ThreadB(MyObject myObject) {
this.myObject = myObject;
}
@Override
public void run() {
myObject.methodB();
}
}
package com.demo2;
public class Run {
public static void main(String[] args) {
MyObject myObject = new MyObject();
ThreadA threadA = new ThreadA(myObject);
ThreadB threadB = new ThreadB(myObject);
threadA.setName("a");
threadB.setName("b");
threadA.start();
threadB.start();
}
}
运行结果:
methodA begin
由结果可以看出 methodB一直没有被调用,也就是说线程B一直在等待线程A释放对象锁。对上述代码,进行如下修改
package com.demo2;
public class MyObject {
public void methodA(){
synchronized(new Object()){
System.out.println("methodA begin");
boolean flag = true;
while(flag){
}
System.out.println("methodA end");
}
}
public void methodB(){
synchronized(new Object()){
System.out.println("methodB begin");
System.out.println("methodB end");
}
}
}
package com.demo2;
public class ThreadA extends Thread {
private MyObject myObject;
public ThreadA(MyObject myObject) {
this.myObject = myObject;
}
@Override
public void run() {
myObject.methodA();
}
}
package com.demo2;
public class ThreadB extends Thread {
private MyObject myObject;
public ThreadB(MyObject myObject) {
this.myObject = myObject;
}
@Override
public void run() {
myObject.methodB();
}
}
package com.demo2;
public class Run {
public static void main(String[] args) {
MyObject myObject = new MyObject();
ThreadA threadA = new ThreadA(myObject);
ThreadB threadB = new ThreadB(myObject);
threadA.setName("a");
threadB.setName("b");
threadA.start();
threadB.start();
}
}
运行结果:
methodA begin
methodB begin
methodB end
由结果可以看出,线程B无需等待线程A释放锁,他们拿到的不是同一个对象锁,这样可以避免使用同步方法造成无限期等待的问题。