-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTestReadWriteLock.java
More file actions
111 lines (90 loc) · 2.89 KB
/
Copy pathTestReadWriteLock.java
File metadata and controls
111 lines (90 loc) · 2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class TestReadWriteLock {
/**
* @param args
*/
public static void main(String[] args) {
TestReadWriteLock tw = new TestReadWriteLock();
Account account = new Account("6222022603002001666", 100000);
final ReadWriteLock rwl = new ReentrantReadWriteLock(); //所有对象公用一把锁
User user1 = tw.new User("张浩", account, -1500,false,rwl);
User user2 = tw.new User("王五", account, -1600,false,rwl);
User user3 = tw.new User("宋柳", account, -1700,false,rwl);
User user4 = tw.new User("杨洋", account, -1800,false,rwl);
User user5 = tw.new User("张得标", account, -1900,true,rwl);
ExecutorService es = Executors.newFixedThreadPool(2);
es.execute(user1);
es.execute(user2);
es.execute(user3);
es.execute(user4);
es.execute(user5);
}
class User implements Runnable{
private String name;
private Account account;
private int amount;
boolean ischeck;
private ReadWriteLock rwl;
public User(String name, Account account, int amount,boolean ischeck,ReadWriteLock rwl) {
this.name = name;
this.account = account;
this.amount = amount;
this.ischeck = ischeck;
this.rwl = rwl;
}
@Override
public void run() {
while(true){
if(ischeck){
rwl.readLock().lock();
System.out.println(name+"--正在查询--,当前余额:"+account.getBalance());
rwl.readLock().unlock();
}else{
rwl.writeLock().lock();
System.out.println(name+"--正在操作账户:"+account.getAccountId()+"操作金额为:"+amount+"当前金额为"+account.getBalance());
account.setBalance(account.getBalance()+amount);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+"--操作账户:"+account.getAccountId()+"成功,操作金额为:"+amount+"当前金额为"+account.getBalance());
rwl.writeLock().unlock();
}
}
}
}
static class Account{
private String accountId;
private int balance;
public Account(String accountId, int i) {
super();
this.accountId = accountId;
this.balance = i;
}
public String getAccountId() {
return accountId;
}
public void setAccountId(String accountId) {
this.accountId = accountId;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "MyCount{" +
"oid='" + accountId + '\'' +
", cash=" + balance +
'}';
}
}
}