多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机多核心处理器以及芯片级多处理同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理” 。本文简单记录一些关于线程、多线程的问题。本文记录了关于一些常见多线程业务问题处理。

多线程问题 1

问题:100个线程并发向1个银行账户中存入1元钱,并在全部完成后,打印银行账户的金额。

思路:创建100个线程(线程池);保证线程安全,同一时刻只有一个线程对账户进行操作(Lock 或者 synchronized)。

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
// 第一种加锁 synchronized
public class Account {
private double balance;
// 获得账户余额
public double getBalance() {
return this.balance;
}
// 锁 存钱方法
public synchronized void deposit(double money) {
double newBalance = this.balance + money;
this.balance = newBalance;
}
}

// 第二种锁 lock
public class Account2 {
private Lock reentrantLock = new ReentrantLock();
private double balance;
// 获得账户余额
public double getBalance() {
return this.balance;
}
// 锁 存钱方法
public void deposit(double money) {
reentrantLock.lock;
double newBalance = 0;
try {
newBalance = balance + money;
balance = newBalance;
} catch(Exception e){
e.printStackTrace();
} finally{
reentrantLock.unlock();
}
this.balance = newBalance;
}
}

// 存钱的线程
public class TheadSaveAccount implements Runnable {
private Account account;
private double money;

public TheadSaveAccount(Account account, double money) {
this.account = account;
this.money = money;
}

@Override
public void run() {
// 锁 整个账户
synchronized (account) {
account.deposit(money);
}
}
}

// 主函数
public class TheadSave {
public static void main (String[] args) {
ExecutorService service = Executors.newFixedThreadPool(100);
Account account = new Account();
for (int i = 0; i < 100; i++) {
service.execute( new TheadSaveAccount(account, 1) );
}
service.shutdown();
if (service.isTerminated()) {
System.out.println(account.getBalance());
}
}
}