package 对象及变量的并发访问2;
/**
* 同步synchronized方法无限等待问题与解决方案
* 但是还是没有解决A死循环的问题啊?
* 只是锁了不同类。。。
*/
class ServiceT2218{
synchronized public void methodA(){
System.out.println("methodA begin");
boolean isContinueRun =true;
//制造资源一直被占有?
while (isContinueRun){
}
System.out.println("methodA end");
}
synchronized public void methoB(){
System.out.println("methodB begin");
System.out.println("methodB end");
}
}
class Service2T2218{
Object object=new Object();
public void MethodA(){
synchronized (object){
System.out.println("methodA begin");
boolean isContinueRun=true;
while (isContinueRun){
}
System.out.println("methodA end");
}
}
Object object2=new Object();
public void MethodB(){
synchronized (object2){
System.out.println("MethodB begin");
System.out.println("MethodB end");
}
}
}
class MyThreadAT2218 extends Thread{
private ServiceT2218 serviceT2218;
public MyThreadAT2218(ServiceT2218 serviceT2218){
super();
this.serviceT2218=serviceT2218;
}
@Override
public void run() {
serviceT2218.methodA();
}
}
class MyThreadA2T2218 extends Thread{
private Service2T2218 service2T2218;
public MyThreadA2T2218(Service2T2218 service2T2218){
super();
this.service2T2218=service2T2218;
}
@Override
public void run() {
service2T2218.MethodA();
}
}
class MyThreadBT2218 extends Thread{
private ServiceT2218 serviceT2218;
public MyThreadBT2218(ServiceT2218 serviceT2218){
super();
this.serviceT2218=serviceT2218;
}
@Override
public void run() {
serviceT2218.methoB();
}
}
class MyThreadB2T2218 extends Thread{
private Service2T2218 service2T2218;
public MyThreadB2T2218(Service2T2218 service2T2218){
super();
this.service2T2218=service2T2218;
}
@Override
public void run() {
service2T2218.MethodB();
}
}
class RunT2218{
public RunT2218(){
ServiceT2218 serviceT2218=new ServiceT2218();
MyThreadAT2218 at2218=new MyThreadAT2218(serviceT2218);
at2218.setName("A");
at2218.start();
MyThreadBT2218 bt2218=new MyThreadBT2218(serviceT2218);
bt2218.setName("B");
bt2218.start();
}
}
class Run2T2218{
public Run2T2218(){
Service2T2218 service2T2218=new Service2T2218();
MyThreadA2T2218 a2T2218=new MyThreadA2T2218(service2T2218);
a2T2218.setName("A2");
a2T2218.start();
MyThreadB2T2218 b2T2218=new MyThreadB2T2218(service2T2218);
b2T2218.setName("B2");
b2T2218.start();
}
}
public class T2218 {
public static void main(String[] args) {
//RunT2218 runT2218=new RunT2218();
Run2T2218 run2T2218=new Run2T2218();
}
}
RunT2218 runT2218=new RunT2218();
Run2T2218 run2T2218=new Run2T2218();