Java多线程同步 synchronized 关键字的使用
2016-06-17 16:28
531 查看
代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和 synchronized 块。
Thread-0 => 2张车票
Thread-0 => 3张车票
Thread-4 => 4张车票
Thread-4 => 5张车票
Thread-2 => 6张车票
….
….
Thread-34 => 98张车票
Thread-34 => 99张车票
Thread-34 => 100张车票
输出结果如下
Thread-0 => 1张车票
Thread-0 => 2张车票
Thread-2 => 1张车票
Thread-2 => 4张车票
Thread-2 => 5张车票
Thread-2 => 6张车票
Thread-2 => 7张车票
Thread-4 => 7张车票
Thread-1 => 1张车票
Thread-1 => 10张车票
Thread-1 => 11张车票
Thread-1 => 12张车票
Thread-1 => 13张车票
可以看出有一个以上的线程访问同一张票
显然是不合理的
JAVA多线程买票案例
synchronized 同步
用synchronized 块实现同步
public static void main(String[] args) { // runable对象的属性代表了一共多少张票 // runable对象的run方法实现了买票的动作 Runnable runnable = new Runnable() { private int count = 100; @Override public void run() { while (true) { synchronized (this) { // synchronized 的对象如果 Thread currentThread = Thread.currentThread(); if (count > 0) { out.println(currentThread.getName()+ " => " + (101 - count) + "张车票"); --count; } else { break; } } } } }; // 开启100个线程模拟100个售票口 for (int i = 0; i < 100; i++) { new Thread(runnable).start(); } }
用synchronized 方法 块实现同步
public static void main(String[] args) { // runable对象的属性代表了一共多少张票 // runable对象的run方法实现了买票的动作 Runnable runnable = new Runnable() { private int count = 100; @Override public void run() { while (true) { if (synchronizedMethod()) break; } } public synchronized boolean synchronizedMethod() { Thread currentThread = Thread.currentThread(); if (count > 0) { out.println(currentThread.getName() + " => " + (101 - count) + "张车票"); --count; return false; } return true; } }; // 开启100个线程模拟100个售票口 for (int i = 0; i < 100; i++) { new Thread(runnable).start(); } }
同步过后的代码输出如下
Thread-0 => 1张车票Thread-0 => 2张车票
Thread-0 => 3张车票
Thread-4 => 4张车票
Thread-4 => 5张车票
Thread-2 => 6张车票
….
….
Thread-34 => 98张车票
Thread-34 => 99张车票
Thread-34 => 100张车票
非同步
synchronized 块
把同步块删除synchronized 方法
把 ynchronized 关键字删除输出结果如下
Thread-0 => 1张车票
Thread-0 => 2张车票
Thread-2 => 1张车票
Thread-2 => 4张车票
Thread-2 => 5张车票
Thread-2 => 6张车票
Thread-2 => 7张车票
Thread-4 => 7张车票
Thread-1 => 1张车票
Thread-1 => 10张车票
Thread-1 => 11张车票
Thread-1 => 12张车票
Thread-1 => 13张车票
可以看出有一个以上的线程访问同一张票
显然是不合理的
相关文章推荐
- java泛型详解
- spring-session学习
- SpringMVC获得客户端的IP地址(草稿)
- java synchronized详解(原文基础改进)
- springmvc+mybaits+spring日志
- spring mvc 项目聚合
- Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题
- 在Eclipse中使用JUnit4进行单元测试(高级篇)
- spring mvc 使用kaptcha生成验证码
- Java中的HashMap和Hashtable
- 在Eclipse中使用JUnit4进行单元测试(中级篇)
- 使用uploadify3.2.1 formData传递其他参数到后台,JAVA后台获取参数方法
- java反射详解
- 在Eclipse中使用JUnit4进行单元测试(初级篇)
- JAVA_AES加密
- Java中Iterable和Iterator的辨析
- java中栈和队列的实现和API用法
- Spring AOP
- spring mvc拦截器的使用记录
- Java线程:概念及原理