一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized
使用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的更多相关文章
- 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...
- java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)
转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
[源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...
- threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证是同一个
threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证同一个线程中是同一个共享对象. 如果是静态变量是共享的话,那必须同步,否则尽管有副本,还是会出错,故C错
- Java线程学习笔记(一个)
一个.正在创建的线程: 老掉牙的话题了.继承 java.lang.Thread父类或者实现Runnalbe接口.这里就提一句: class Thread implements Runnable Thr ...
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法(转)
对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的 对每一个class只有一个thread可以执行synchronized static method ...
- 线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)
任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...
- java main()线程是不是最后一个退出的(相比较main中创建的其他多个线程)
JVM会在所有的非守护线程(用户线程)执行完毕后退出: main线程是用户线程: 仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程. pu ...
随机推荐
- google翻译,翻译当前的网页
网页翻译为德语(Translate Page To German) <a href="javascript: void(window.open('http://translate.go ...
- [IR] Evaluation
无序检索结果的评价方法: Precision P = tp/(tp + fp) Recall R = tp/(tp + fn) Accuracy = (tp + tn) ...
- 更加优雅地搭建SSH框架(使用java配置)
时代在不断进步,大量基于xml的配置所带来的弊端也显而易见,在XML配置和直接注解式配置之外还有一种有趣的选择方式-JavaConfig,它是在Spring 3.0开始从一个独立的项目并入到Sprin ...
- 阅读《深入理解JavaScript定时机制》
鸟哥的这篇<深入理解JavaScript定时机制>从javascript线程角度分析了setTimeout和setInterval两个定时触发器的实现原理. 看完的体验就是主要要记住两点: ...
- IOS开发UI基础文本属性Attributes
文本属性Attributes 1.NSKernAttributeName: @10 调整字句 kerning 字句调整 2.NSFontAttributeName : [UIFont systemFo ...
- mysql如何更改数据库名(一键实现mysql改数据库名)
由于某种原因,有时我们有可能需要数据库的名称,但是不像官方有rename可以去更改表名,并没有一个命令可以去更新数据库的名字. 思路:借助rename这个命令 基本操作:rename olddb.ta ...
- 黑客入门之IP地址及常用命令
在网络上,只要利用IP地址就可以找到目标主机,因此,如果黑客想要攻击某个网络主机,就要先确定该目标主机的域名或IP地址. IP地址概述 所谓IP地址就是一种主机编址方式,给每个连接在Internet上 ...
- 【iOS】线程安全的文件读写
前段时间看了一遍GCD(Grand Central Dispatch)多线程,GCD是苹果为多核开发提供的解决方案 多线程最常见的问题就是读写,比如数据库读写,文件读写,读取是共享的,写是互斥,允许多 ...
- 介绍两种风格的URL
两种风格的“动态资源”——统一资源定位符(Uniform Resource Lactor,URL) 当前互联网上主要有两种主要风格的URL: 第一种直接在URL中知名文件(比如xxx.php,xxx. ...
- MVC控制器向View视图传值的三种方法
首先创建一个MVC的项目,其中需要一个控制器(TestController),三个视图(index,edit,detail) 1.项目结构如下: