1.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class DirtyRead { 2 private String username = "ck"; 3 private String password = "123"; 4 5 public synchronized void setValue(String username, String password){ 6 this.username = username; 7 try { 8 System.out.println("线程:"+Thread.currentThread().getName()+"===>>>正在setvalue"); 9 Thread.sleep(2000); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } 13 this.password = password; 14 System.out.println("线程:"+Thread.currentThread().getName()+"===>>>setvalue最终结果:username="+username+"; password:"+password ); 15 } 16 17 public synchronized void getValue(){ 18 System.out.println("线程:"+Thread.currentThread().getName()+"===>>>getValue最终结果:usrname:"+username+";password:"+password); 19 } 20 21 public static void main(String[] args) throws Exception { 22 final DirtyRead dirtyRead = new DirtyRead(); 23 Thread t1 = new Thread(new Runnable() { 24 @Override 25 public void run() { 26 dirtyRead.setValue("ckang", "456"); //对象锁dirtyRead 27 } 28 }, "t1"); 29 t1.start(); 30 31 Thread.sleep(1000); 32 dirtyRead.getValue(); 33 } 34 /* 35 如果setValue和getValue方法不加sychronized, t1休息2s的时候被main抢了cpu. 36 线程:t1===>>>正在setvalue 37 线程:main===>>>getValue最终结果:usrname:ckang;password:123 38 线程:t1===>>>setvalue最终结果:username=ckang; password:456 39 40 如果set/get方法加了synchronized, 谁抢到cpu必须等执行完释放锁,才会切换到另外一个线程 41 线程:t1===>>>正在setvalue 42 线程:t1===>>>setvalue最终结果:username=ckang; password:456 43 线程:main===>>>getValue最终结果:usrname:ckang;password:456 44 */ 45 }