Java多线程的安全
2016-11-23 20:25
134 查看
版权声明:转载请注明出处,谢谢配合
多线程会出现安全隐患,通常有以下两个解决办法:
1.使用同步synchronized
同步的前提:
1.必须是多个线程
2.必须使用同一把锁
同步的利弊:
1.好处:解决了多线程的安全隐患
2.坏处:执行时间变长,效率低
2.wait和notify机制
必须持有锁
必须是同一个锁
下面用一个问题来讲解多线程
有个游泳池,有6个水龙头
每个水龙头一次灌10L水
每个水龙头灌5次,要求输出游泳池当前水量
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
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
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
多线程会出现安全隐患,通常有以下两个解决办法:
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
相关文章推荐
- Java 多线程安全 单例
- java多线程及安全问题
- Java基础——多线程的安全问题
- Java多线程总结之线程安全队列Queue
- [原]Java多线程编程学习笔记之七:多线程环境中安全使用集合API(含代码)
- Java的多线程编程模型2--怎样才线程安全
- java 多线程安全总结
- 黑马程序员——java第十一、十二天:多线程(创建线程1-2、多线程同步代码、实现Runnable接口、安全死锁)
- 黑马程序员--JAVA基础复习之多线程(二)线程安全与解决方法
- java多线程安全问题的解决
- Java多线程总结之线程安全队列Queue
- Java笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁
- Java 中的多线程-两种创建方式,定时器的应用,线程的安全问题可以用银行转账来说明
- Java 锁LOCK&多线程安全
- 《黑马程序员》java笔记->多线程安全问题
- Java 学习笔记16:用ThreadLocal解决多线程安全问题
- Java多线程技术初识——4. 多线程安全问题的解决
- Java多线程总结之线程安全队列Queue
- 【Java并发编程】之八:多线程环境中安全使用集合API(含代码)
- 黑马程序员—10—java基础:有关多线程安全的学习笔记和学习心得体会