一:
/**
* 对于要同步的资源管理要谨慎,向本方法中的变量a,在m1方法中加了synchronized使其同步,但在m2方法中没有加该关键字,m2方法是普通方法,所以m2方法不仅可以访问a,还可以对其进行更改值。
*/
package com.lbl.constantlyupdated;
public class MyThread implements Runnable{
public static int a = 100;
public synchronized void m1() throws InterruptedException{
System.out.println("MyThread.m1()近来了");
a = 500;
Thread.sleep(5000);
System.out.println("MyThread.m1().a=" + a);
}
public void m2 (){
System.out.println("MyThread.m2()近来了");
a = 1000;
System.out.println("MyThread.m2().a=" + a);
}
@Override
public void run() {
try {
m1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
new Thread(myThread).start();
Thread.sleep(1000);
myThread.m2();
}
}
执行结果:
MyThread.m1()近来了
MyThread.m2()近来了
MyThread.m2(). a=1000
MyThread.m1(). a=1000
(二)对其进行改进:
将m2()方法改为:
public synchronized void m2 (){
System.out.println("MyThread.m2()近来了");
a = 1000;
System.out.println("MyThread.m2().a=" + a);
}
执行结果:
MyThread.m1()近来了
MyThread.m1(). a=500
MyThread.m2()近来了
MyThread.m2(). a=1000
因为m1方法执行中对资源a加了把锁,所以m2只能等待m1方法结束才能获取锁,并开始执行方法。
总结:对于需要同步的资源,对于读取数据值的方法可以不加锁(加的话效率会降低,而且也没有实际用处);但是如果多个方法都要对其更改泽都要加锁,否则会出现不一致现象