一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--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; //设置标识为truenotifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒
        }//减法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; //设置标识为truenotifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒
    }
}

 

 

 

 

package com.pb.thread.demo5;public class Add implements Runnable {private Count count;public Add(Count count){this.count=count;} @Overridepublic 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;} @Overridepublic 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;} @Overridepublic 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;} @Overridepublic 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

 

转载于:https://www.cnblogs.com/liunanjava/p/4822062.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用UI技术提升租房类APP的看房体验?

这个看你处理的数据够不够复杂啦。 越个性化,越流程的APP越需要处理复杂的数据。 使用SVG制作户型结构编辑器。

jboss 发布web_JBoss模块示例–模块化Web应用程序

jboss 发布web最近,我读到了为什么没有标准来开发真正的模块化Web应用程序? 由Patroklos Papapetrou撰写( 在Java Code Geeks中也有介绍 )。 受本文的启发,我决定检查实际使用的JBoss模块 。 这篇文章逐步描述了我的实…

南方数据后台的WEBSHEL

南方数据企业系统&#xff0c;后台上传截断拿webshell 在“新闻资讯”-“添加新闻”模块中&#xff0c;在“新闻图片”中点击“上传”按钮&#xff0c;会出现一个弹窗&#xff0c;复制弹窗的地址&#xff0c;在新标签页中打开 本地准备个asp类型的一句话木马&#xff1a;<%…

【APICloud系列|20】如何使用使用APICloud开发出优质的Hybrid App

谈到这里,我先抛出几个问题,虽然他们社区比较活跃,我曾经也在上面开发过一款办公类应用并成功上架到各大安卓应用商店与APPstore,有兴趣的可以看看我以前的帖子。新手可以学习一下他们七天的教学,可以很快的入门,至于他们官方的一些视频可能比较陈旧,凑合着看吧,影响不是…

java对象的序列化机制详解

Java对象的序列化机制 Java对象的序列化&#xff0c;是将内存中的java对象转化为二进制的字节流&#xff0c;然后保存到磁盘中或者在网络上。这就是序列化对象&#xff0c;反序列化顾名思义就是将对象的二进制字节流恢复成原来的对象。注意只有对象的类名和属性能被序列化&…

测试并发应用

本文是我们学院课程中名为Java Concurrency Essentials的一部分 。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全之类的概念。 在这里查看 &#xff01; 目录 1.简介 2. Sim…

无忧企业系统的getshell

方法一&#xff1a;数据库备份 写入后进行数据库备份 路径 shell工具连接 方法二&#xff1a;修改允许上传后缀&#xff0c;直接上传马

如何使用FinalShell、FileZilla上传网站代码到服务器?这两个都是神器

这段时间想做一个导航网站来着,然后就简单写了一个网页,买了一个域名、一台ECS服务器,都是比较便宜的那种,https://www.aliyun.com/minisite/goods?userCode=1k1odmgm 这个学生或者新用户基本都是一折,还能玩得起。所有软件的安装除了选择安装路径,都可以无脑按安装。 …

[CareerCup] 9.6 Generate Parentheses 生成括号

9.6 Implement an algorithm to print all valid (e.g., properly opened and closed) combinations of n-pairs of parentheses.EXAMPLEInput: 3Output: ((())), (()()), (())(), ()(()), ()()() LeetCode上的原题&#xff0c;请参见我之前的博客Generate Parentheses 生成括号…

神经网络:深度学习优化方法

1.有哪些方法能提升CNN模型的泛化能力 采集更多数据&#xff1a;数据决定算法的上限。 优化数据分布&#xff1a;数据类别均衡。 选用合适的目标函数。 设计合适的网络结构。 数据增强。 权值正则化。 使用合适的优化器等。 2.BN层面试高频问题大汇总 BN层解决了什么问…

PDF.js如何添加放大缩小的功能,转换成图片应该如何实现?

把官方的安装包搞下来,自己的PDF文件及index.html添加进去,上面的目录结构是未添加的,我先把PDF文件搞成canvas然后搞成图片,然后再图片上添加按钮对图片进行放大缩小操作,方便对用户行为进行录屏。 <!DOCTYPE HTML> <html data-dpr="1" style="…

mimikatz免杀过360和火绒

mimikatz mimikatz是一款能够从Windows认证&#xff08;LSASS&#xff09;的进程中获取内存&#xff0c;并且获取名闻密码和NTLM哈希值的工具&#xff0c;攻击者可以利用这种功能漫游内网。也可以通过明文密码或者hash值进行提权。这款工具机器出名所以被查杀的几率极高。 1、…

ibatis Parameter index out of range (1 number of parameters, which is 0)

这个错误除了网上常见的like写错之外&#xff0c;这里列出其中一种写法like concat(%, #keyword#, %),还有另外的多写单引号什么的以外&#xff0c;今天遇到另一个原因,百度谷歌各种查也没查到&#xff0c;最后才意识到由于我是在navicat中的写好的再粘贴上去的&#xff0c;注释…

SVN:请求不到主机,应该如何解决?

连了公司的局域网&#xff0c;可能一个账号人多的缘故&#xff0c;给你们讲一下思路。确保一点在同一个局域网。 然后ping一下域名。也是不通的 把域名换成IP进行访问试试&#xff0c;这个检查一下路径没有问题即可。

MSSQL提权

之前对MSSQL提权了解较少&#xff0c;所以在这里记录一些关于这类提权的几种姿势 1.xp_cmdshell提权 存储过程为数据库提供了强大的功能&#xff0c;其类似UDF&#xff0c;在MSSQL中xp_cmdshell可谓臭名昭著了。MSSQL强大的存储过程也为黑客提供了遍历&#xff0c;在相应的权…

如何以及为什么序列化Lambda

总览 lambda序列化在许多用例中很有用&#xff0c;例如持久配置或作为远程资源的访客模式 。 远程访客 例如&#xff0c;因此我想访问远程Map上的资源&#xff0c;可以使用get / put&#xff0c;但是说我只想从Map的值中返回一个字段&#xff0c;我可以将lambda作为访问者来传…

NSTimer注意内存泄露(真该死)

NSTimer可以用来执行一些定时任务&#xff0c;比较常用的方法就是&#xff1a; (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; 可是&#xff0c;仔细看官方文档中对于参数t…

Redis漏洞利用的4种方法

Redis简介 redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。这些数据类型都支持push/pop、add/remov…

系统已有MYSQL环境,如何安装宝塔面板

最近一直想搞一个在线博客网站&#xff0c;把代码部署到服务器。 下载己经下载了宝塔的.exe文件,安装提示系统已经存在MYSQL环境&#xff0c;请用纯净系统安装。 因为我以前做java的&#xff0c;已经装了&#xff0c;现在把它卸载即可。 WINR打开注册表输入regedit。 删除HK…

Mysql命令alter add:增加表的字段

alter add命令用来增加表的字段。alter add命令格式&#xff1a;alter table 表名 add字段 类型 其他;例如&#xff0c;在表MyClass中添加了一个字段passtest&#xff0c;类型为int(4)&#xff0c;默认值为0&#xff1a; mysql> alter table MyClass add passtest int(4) …