您的位置:首页 > 编程语言 > Java开发

Java多线程的安全

2016-11-23 20:25 134 查看
版权声明:转载请注明出处,谢谢配合

多线程会出现安全隐患,通常有以下两个解决办法:

1.使用同步synchronized

同步的前提:

1.必须是多个线程

2.必须使用同一把锁

同步的利弊:

1.好处:解决了多线程的安全隐患

2.坏处:执行时间变长,效率低

2.wait和notify机制

必须持有锁

必须是同一个锁

下面用一个问题来讲解多线程

有个游泳池,有6个水龙头

每个水龙头一次灌10L水

每个水龙头灌5次,要求输出游泳池当前水量

package com.example.day0725;
/**
* 该水池类的出现确保了数据的共享
*/
public class Pool {

private int water=0;
Object object;

/**
* 同步方法
* 因为非静态方法是被对象调用的,所以这个同步方法使用的锁是自己本身对象:this
* 静态方法:JVM首先将java编译成.class
* 这时候.class是作为对象存在
* 所以使用的锁:类名.class
*
* 封装代码
* @param n
*/
public synchronized void addWater(int n){
water+=n;
System.out.println("当前水量:"+water);
}
}
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


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
package com.example.day0725;

public class WaterTop implements Runnable {

/**
* 确定一个线程是否安全:
* 1.执行使用多线程使用的代码
* 2.是否操作了共享数据
* 3.操作共享数据时是否会出现安全问题
*/
private Pool pool=new Pool();
public void run() {
for (int count=1;count<=5;count++) {
pool.addWater(10);
}

}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.example.day0725;

public class Am25 {

public static void main(String[] args) {
/*WaterTop waterTop=new WaterTop();
new Thread(waterTop).start();
new Thread(waterTop).start();
new Thread(waterTop).start();
new Thread(waterTop).start();
new Thread(waterTop).start();
new Thread(waterTop).start();*/
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: