20分 |
public class A { /** * 静态方法 */ public synchronized static void staticMethod(){} /** * 实例方法 */ public synchronized void instanceMethod(){} public static void main(String[] args) { //A实例的创建过程 Class c = Class.forName("A"); A a1 = c.newInstance(); A a2 = c.newInstance(); A a3 = c.newInstance(); } } 如上代码所示,你看一看main方法里面A实例的创建过程,这个要先理解 instanceMethod这个实例方法,你创建多少个A实例,这些实例都存在各自的instanceMethod方法,这个方法前加synchronized关键词,会锁住该instanceMethod方法所在的实例。如a1的instanceMethod方法会锁住a1指向的实例,a2的instanceMethod会锁住a2指向的实例。 由此得出结论,staticMethod与instanceMethod锁住的对象是不可能相同的,这就是两个方法不能同步的原因。 |
算是明白一些了,自己写了个测试代码。 第四点表达的意思应该是:线程1调用非静态的synchronized方法,线程2调用静态的synchronized方法,两者互不影响。 注:如果线程1和2,同为非静态或静态,则必须等一个线程执行完,再执行下一个。
求大神指正。。。。(以前语文没学好,现在后悔了) import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class StaticThread { public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(2); List<Future<String>> resultList = new ArrayList<Future<String>>(); SyncObj syncObj = new SyncObj(); for(int i=0; i<2; i++){ Future<String> future = service.submit(new CallThread(syncObj, i)); resultList.add(future); } for(int j=0; j<resultList.size(); j++){ try { System.out.println(resultList.get(j).get()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } service.shutdown(); } } class CallThread implements Callable<String>{ private int id; private SyncObj syncObj; CallThread(SyncObj syncObj, int id){ this.id = id; this.syncObj = syncObj; } @Override public String call() throws Exception { if(id%2 ==0){ syncObj.getFun1(id); }else{ syncObj.getStatic1(id); } return "线程 "+id+"执行完毕!"; } } class SyncObj{ public synchronized static void getStatic1(int id){ System.out.println("线程 "+id+"进入getStatic1()!"); for (int i = 0 ; i < 9999999; i--); System.out.println("线程 "+id+"退出getStatic1()!"); } public synchronized static void getStatic2(int id){ System.out.println("线程 "+id+"进入getStatic2()!"); for (int i = 0 ; i < 9999999; i--); System.out.println("线程 "+id+"退出getStatic2()!"); } public synchronized void getFun1(int id) throws InterruptedException{ System.out.println("线程 "+id+"进入getFun1()!"); // this.wait(); for (int i = 0 ; i < 999999; i--); System.out.println("线程 "+id+"退出getFun1()!"); } public synchronized void getFun2(int id){ System.out.println("线程 "+id+"进入getFun2()!"); for (int i = 0 ; i < 9999999; i--); System.out.println("线程 "+id+"退出getFun2()!"); } } |
|
谢谢!~ |