使用synchronized

  1. package com.pb.thread.demo5;
  2.  
  3. /**使用synchronized
  4. * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行
  5. *
  6. * @author Denny
  7. *
  8. */
  9. public class Count {
  10. private int num = 0;
  11. private boolean flag = false; // 标识
  12. //加法
  13. public synchronized void add() {
  14. while (flag) {
  15. try {
  16. wait();
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. this.num++; //加
  22. System.out.println(Thread.currentThread().getName() + "........" + this.num);
  23. this.flag=true; //设置标识为true
  24. notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒
  25.  
  26. }
  27. //减法
  28. public synchronized void sub() {
  29. while (!flag) {
  30. try {
  31. wait();
  32. } catch (InterruptedException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. this.num--; //减
  37. System.out.println(Thread.currentThread().getName() + "........" + this.num);
  38. this.flag=false; //设置标识为true
  39. notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒
  40. }
  41. }
  1. package com.pb.thread.demo5;
  2.  
  3. public class Add implements Runnable {
  4. private Count count;
  5. public Add(Count count){
  6. this.count=count;
  7. }
  8.  
  9. @Override
  10. public void run() {
  11. while(true){
  12. count.add();
  13. }
  14.  
  15. }
  16.  
  17. }
  18. //================
  19. package com.pb.thread.demo5;
  20.  
  21. public class Sub implements Runnable {
  22. private Count count;
  23. public Sub(Count count){
  24. this.count=count;
  25. }
  26.  
  27. @Override
  28. public void run() {
  29. while(true){
  30. count.sub();
  31. }
  32.  
  33. }
  34.  
  35. }

测试类

  1. package com.pb.thread.demo5;
  2.  
  3. public class CountTest {
  4.  
  5. public static void main(String[] args) {
  6. Count c=new Count();
  7. Add add=new Add(c);
  8. Sub sub=new Sub(c);
  9. Thread t1=new Thread(add);
  10. Thread t2=new Thread(add);
  11. Thread t3=new Thread(sub);
  12. Thread t4=new Thread(sub);
  13. t1.start();
  14. t2.start();
  15. t3.start();
  16. t4.start();
  17.  
  18. }
  19.  
  20. }

结果:

 
  1. Thread-2........0
  2. Thread-1........1
  3. Thread-3........0
  4. Thread-0........1
  5. Thread-2........0
  6. Thread-1........1
  7. Thread-3........0
  8. Thread-0........1
  9. Thread-2........0
 

不使用synchronized

  1. package com.pb.thread.demo4;
  2.  
  3. import java.util.concurrent.locks.Condition;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;
  6. /**
  7. * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行
  8. * @author Denny
  9. *
  10. */
  11. public class Count {
  12. private int num = 0;
  13. private boolean flag=false; // 标识
  14. Lock lock = new ReentrantLock(); // 锁
  15. Condition add = lock.newCondition(); // 加法锁
  16. Condition sub = lock.newCondition();// 减法锁
  17.  
  18. public void add() {
  19. lock.lock();// 锁上
  20. try {
  21. while (flag) { //循环判断
  22.  
  23. add.await();
  24. }
  25. this.num++;
  26. System.out.println(Thread.currentThread().getName() + "........" + this.num);
  27. this.flag = true; // 设置标识
  28. sub.signal(); // 唤醒指定线程
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }finally{
  32. lock.unlock();
  33. }
  34.  
  35. }
  36.  
  37. public void sub() {
  38. lock.lock();// 锁上
  39. try {
  40. while (!flag) {//循环判断
  41.  
  42. sub.await();
  43. }
  44. this.num--;
  45. System.out.println(Thread.currentThread().getName() + "........" + this.num);
  46. this.flag = false; // 设置标识
  47. add.signal(); // 唤醒指定线程
  48. } catch (InterruptedException e) {
  49. e.printStackTrace();
  50. }finally{
  51. lock.unlock();
  52. }
  53.  
  54. }
  55.  
  56. }
  1. package com.pb.thread.demo4;
  2.  
  3. public class Add implements Runnable {
  4. private Count count;
  5. public Add(Count count){
  6. this.count=count;
  7. }
  8.  
  9. @Override
  10. public void run() {
  11. while(true){
  12. count.add();
  13. }
  14.  
  15. }
  16.  
  17. }
  1. package com.pb.thread.demo4;
  2.  
  3. public class Sub implements Runnable {
  4. private Count count;
  5. public Sub(Count count){
  6. this.count=count;
  7. }
  8.  
  9. @Override
  10. public void run() {
  11. while(true){
  12. count.sub();
  13. }
  14.  
  15. }
  16.  
  17. }
  1. package com.pb.thread.demo4;
  2.  
  3. public class CountTest {
  4.  
  5. public static void main(String[] args) {
  6. Count c=new Count();
  7. Add add=new Add(c);
  8.  
  9. Sub sub=new Sub(c);
  10. Thread t1=new Thread(add);
  11. Thread t2=new Thread(add);
  12. Thread t3=new Thread(sub);
  13. Thread t4=new Thread(sub);
  14. t1.start();
  15. t2.start();
  16. t3.start();
  17. t4.start();
  18.  
  19. }
  20.  
  21. }

结果:

 
  1. Thread-1........1
  2. Thread-3........0
  3. Thread-0........1
  4. Thread-2........0
  5. Thread-1........1
  6. Thread-3........0
  7. Thread-0........1
  8. Thread-2........0
 

一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized的更多相关文章

  1. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

  2. java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  3. Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)

    转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...

  4. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

  5. threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证是同一个

    threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证同一个线程中是同一个共享对象. 如果是静态变量是共享的话,那必须同步,否则尽管有副本,还是会出错,故C错

  6. Java线程学习笔记(一个)

    一个.正在创建的线程: 老掉牙的话题了.继承 java.lang.Thread父类或者实现Runnalbe接口.这里就提一句: class Thread implements Runnable Thr ...

  7. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法(转)

    对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的 对每一个class只有一个thread可以执行synchronized static method ...

  8. 线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)

    任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...

  9. java main()线程是不是最后一个退出的(相比较main中创建的其他多个线程)

    JVM会在所有的非守护线程(用户线程)执行完毕后退出: main线程是用户线程: 仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程. pu ...

随机推荐

  1. PLSQL快捷补充代码设置

    菜单Tools-->Preferences...然后依次选择下图红色选项 弹出下图对话框 输入需要快速生成的语句点击保存 点击Save后在slq窗口中输入 设置的语句缩写 列入:第一个sf  然 ...

  2. 路由器换大Flash

    使用winhex自建编程器固件(我的是TP-WR941N V6) 1:使用winhex新建一个8M,16M的文件,编辑-全选,填充选块,填充十六进制数值 FF : 2:打开4M的原厂编程器固件(或者自 ...

  3. 搭建windows下filezilla FTP服务器

    FTP服务器必不可少,鉴于serv-u越来越冗余繁多的设置,个人还是比较喜欢简单.干净,满足需求即可的东东,所以选择filezilla.更主要的原因是ta是开元免费使用的,虽然免费,功能却齐全,我发现 ...

  4. Web程序员开发App系列 - 调试Android和IOS手机代码(补图)

    Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...

  5. 红黑树(四)之 C++的实现

    概要 前面分别介绍红黑树的理论知识和红黑树的C语言实现.本章是红黑树的C++实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章. 目录1. 红黑树的介绍2. 红黑树的C++ ...

  6. [IR] Boolean retrieval

    How to build Inverted Index? 1. Token sequence. 2. Sort by terms. 3. Dictionary & Postings code ...

  7. RPM安装命令总结--转载

    原地址:http://www.cnblogs.com/zqwang0929/p/3352237.html 在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装.卸载及管理等操作.RPM 的 ...

  8. 将excel导入mysql(使用navicat)

    excel: 注: 1.mysql里建立一张跟excel一样的表结构的表(包含id) 2.excel最好没有任何格式,只是纯值,不然会出现导入不了的错误 ----------------------- ...

  9. 开源一个基于天天团购的团购app

    可能大家都知道天天团购开源系统,一个做团购的开源项目很赞,前些日子做了基于天天团购系统做的团购客户端和移动端服务器!源代码放出,有了解的可以看看,希望收益! 先说服务器:app的服务器,基于天天团购的 ...

  10. 拓扑图弹力布局呈现Flickr图片搜索结果

    十年前有值得分享的图片我都存在Flickr上,可惜yahoo收购了Flickr之后堕落​好多年,最近yahoo在梅姐带领下Flickr团队终于恢复了生机,个人免费存储空间扩充到了1T,界面用户体验也有 ...