多线程4---对象锁--脏读

1.

 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 }
View Code
原文地址:https://www.cnblogs.com/bravolove/p/7944255.html