使用synchronized

package com.pb.thread.demo5;

/**使用synchronized
* 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行
*
* @author Denny
*
*/
public class Count {
private int num = 0;
private boolean flag = false; // 标识
//加法
public synchronized void add() {
while (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.num++; //加
System.out.println(Thread.currentThread().getName() + "........" + this.num);
this.flag=true; //设置标识为true
notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒 }
//减法
public synchronized void sub() {
while (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.num--; //减
System.out.println(Thread.currentThread().getName() + "........" + this.num);
this.flag=false; //设置标识为true
notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒
}
}
package com.pb.thread.demo5;

public class Add implements Runnable {
private Count count;
public Add(Count count){
this.count=count;
} @Override
public void run() {
while(true){
count.add();
} } }
//================
package com.pb.thread.demo5; public class Sub implements Runnable {
private Count count;
public Sub(Count count){
this.count=count;
} @Override
public void run() {
while(true){
count.sub();
} } }

测试类

package com.pb.thread.demo5;

public class CountTest {

    public static void main(String[] args) {
Count c=new Count();
Add add=new Add(c);
Sub sub=new Sub(c);
Thread t1=new Thread(add);
Thread t2=new Thread(add);
Thread t3=new Thread(sub);
Thread t4=new Thread(sub);
t1.start();
t2.start();
t3.start();
t4.start(); } }

结果:

 
Thread-2........0
Thread-1........1
Thread-3........0
Thread-0........1
Thread-2........0
Thread-1........1
Thread-3........0
Thread-0........1
Thread-2........0
 

不使用synchronized

package com.pb.thread.demo4;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行
* @author Denny
*
*/
public class Count {
private int num = 0;
private boolean flag=false; // 标识
Lock lock = new ReentrantLock(); // 锁
Condition add = lock.newCondition(); // 加法锁
Condition sub = lock.newCondition();// 减法锁 public void add() {
lock.lock();// 锁上
try {
while (flag) { //循环判断 add.await();
}
this.num++;
System.out.println(Thread.currentThread().getName() + "........" + this.num);
this.flag = true; // 设置标识
sub.signal(); // 唤醒指定线程
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
} } public void sub() {
lock.lock();// 锁上
try {
while (!flag) {//循环判断 sub.await();
}
this.num--;
System.out.println(Thread.currentThread().getName() + "........" + this.num);
this.flag = false; // 设置标识
add.signal(); // 唤醒指定线程
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
} } }
package com.pb.thread.demo4;

public class Add implements Runnable {
private Count count;
public Add(Count count){
this.count=count;
} @Override
public void run() {
while(true){
count.add();
} } }
package com.pb.thread.demo4;

public class Sub implements Runnable {
private Count count;
public Sub(Count count){
this.count=count;
} @Override
public void run() {
while(true){
count.sub();
} } }
package com.pb.thread.demo4;

public class CountTest {

    public static void main(String[] args) {
Count c=new Count();
Add add=new Add(c); Sub sub=new Sub(c);
Thread t1=new Thread(add);
Thread t2=new Thread(add);
Thread t3=new Thread(sub);
Thread t4=new Thread(sub);
t1.start();
t2.start();
t3.start();
t4.start(); } }

结果:

 
Thread-1........1
Thread-3........0
Thread-0........1
Thread-2........0
Thread-1........1
Thread-3........0
Thread-0........1
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. css的两种引用方式 link和@import

    学习web开发的最大乐趣就是不断的发现自己以前不曾见过的东西,这些东西对于我来说是那么的新鲜有趣. 比如说今天偶尔研究别人的网站,就发现了有趣的东东. 当点开此网页的css时(这个css文件命名方式就 ...

  2. (转)ubuntu安装opengl

    $ sudo apt-get install build-essential 安装OpenGL Library接下来要把我们会用到的 Library 装上去,首先安装 OpenGL Library $ ...

  3. jsp,OGNL调用后台Action的某方法

    用%{}可取出valueStack中的Action,可直接调用其方法. %{testa('key')} 即可调用到action的testa(String s) 方法 但这些都需要结合struts2的标 ...

  4. Mergely – 免费的在线文档对比和合并工具

    任何类型的文件(无论是否代码),我们可能要比较不同的版本,看发生了什么变化. 有些编辑器都有这个内置功能,其中一些则没有. Mergely 是一个免费使用的 Web 应用程序,帮你你迅速作出文档的差异 ...

  5. JS&CSS文件请求合并及压缩处理研究(一)

    在我们日常的网站开发工作中,一个页面难免会引用到各种样式及脚本文件.了解Web开发的朋友们都知道,页面引用的每一个: <link href="style.css" rel=& ...

  6. Entity Framework的默认值BUG解决方法

    在使用.Net 3.5里的Entity Framework开发网站的时候,遇到了一个问题:添加记录时,对于DateTime型的数据,无法使用数据库的默认值. 具体的情况是这样的,我的数据库有个User ...

  7. Java魔法堂:注解用法详解——@SuppressWarnings

    一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“感叹号”就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWar ...

  8. [ASP.NET]谈谈IIS与ASP.NET管道

    作为一个Asp.Net平台开发者,非常有必要了解IIS和Asp.Net是如何结合,执行我们的托管代码,以及Asp.Net管道事件的. 本节目录 IIS 5.X IIS 6 IIS 7+ 集成模式 As ...

  9. SpringMVC——类型转换和格式化、数据校验、客户端显示错误消息

    在介绍类型转换和格式化之前,我首先来介绍 <mvc:annotation-driven />. 需要导入的 schema: xmlns:mvc="http://www.sprin ...

  10. jquery选择器(原创)<四>

    前面学习了基本选择器,现在学习过滤选择器中的简单过滤选择器: 简单过滤选择器,主要根据索引值对元素进行筛选,这些过滤选择器类似于CSS的伪类选择器,他们均以冒号(:)开头,并且要与另外一个选择器一起使 ...