题目有点长,不知道大家能不能明白! 首先得出的结论是: 它们是互相影响的,因为在一个实例类中同步方法锁定的是该实例类对象,因此会互相影响. 下面是我做的一个测试: (1)创建一个实例类: package com.lenove.testThread; public class SynchronizationObject { public SynchronizationObject(){ } public synchronized void runSynchronizationMethod0(){ System.out.println("this is start test0!"); //该循环的目地只有一个,就是可以使当前方法在一定时间内交出执行线程 for(int i = 0;i < 10000000;i++){ } System.out.println("this is end test0!"); } public synchronized void runSynchronizationMethod1(){ System.out.println("this is start test1!"); for(int i = 0;i < 10000000;i++){ } System.out.println("this is end test1!"); } } (2)创建一个调用的线程类 package com.lenove.testThread; public class testThread implements Runnable { Thread th; int type; SynchronizationObject so; public testThread(SynchronizationObject so,int type){ this.so = so; th = new Thread(this); th.start(); } public void run() { if(type == 1) so.runSynchronizationMethod1(); else so.runSynchronizationMethod0(); } public static void main(String[] args){ SynchronizationObject so = new SynchronizationObject(); new testThread(so,1); new testThread(so,0); } } 程序执行后.无论执行多少次,结果为: this is start test1! this is end test1! this is start test0! this is end test0! 这时如果将SynchronizationObject 实例对象的任意一个方法的同步去掉(即去掉方法前面的synchronized),执行结果将出现一定的变化 第一次执行: 第二次执行: this is start test1! this is start test1! this is start test0! this is end test1! this is end test1! this is start test0! this is end test0! this is end test0! 这时结果出现运行时刻输出结果不一致的情况,这说明同时访问一个实例对象的不同的同步方法,相互之间是有影响的,它们之间使用的锁就是该实例对象. 运行情况分析: 当第一个线程执行时,运行到runSynchronizationMethod1()方法时,由于该方法是synchronizated,这时会先将so锁定,然后执行方法内的语句,中间由于大循环,线程交出执行权,交由第二个线程执行,第二个线程执行时,运行到runSynchronizationMethod0()方法,由于该方法也是synchronizated,这时该对象试图对so进行锁定,但由于之间该对象已被锁定,因此其锁定失败,需要等待第一个线程对so进行解锁,这里线程调度将控制权交给第一个线程执行,第一个线程执行完毕runSynchronizationMethod1()方法,这时对so进行解锁,这时线程交到第二个线程,第二个线程对so进行锁定操作,并可以锁定成功,因此继续执行完runSynchronizationMethod0()方法中的内容,.并进行解锁.
java多线程如何同步问题_关于java多线程中同步的问题(两个线程访问同一个实例类的两个同步方法,会不会互相影响)...
最新推荐文章于 2021-02-28 03:38:23 发布