- 浏览: 551393 次
文章分类
- 全部博客 (373)
- java 文件读取 (2)
- juery (1)
- 打印 (1)
- js (3)
- oracle (4)
- 数据库 (2)
- tomcat (2)
- pdf2swf (1)
- svn错误总结 (1)
- struts (1)
- mysql (11)
- struts2 (2)
- powerdesigner (1)
- ibatis (1)
- 无线技术 (1)
- 验证码 (1)
- 身份证的算法 (1)
- java多线程 (12)
- java敏感词替换 (1)
- struts2文件上传 (1)
- cache ibatis 数据缓存 (1)
- PermGen space TOMCAT (1)
- java反射 (1)
- 存储架构 (1)
- NFS (1)
- Java回调函数 (1)
- 数据库锁 (1)
- jaxb (1)
- android异常 (1)
- 自定义标签tld (1)
- HttpSessionListener (1)
- Spring AOP应用 (1)
- 如何获取e.printStackTrace()的内容 (1)
- jms activemq (1)
- EhCache (3)
- JNA (1)
- AJP (1)
- jQuery (1)
- 依赖注入 (1)
- EJB (1)
- ant (1)
- 快速失败 (1)
- 并发集合 (1)
- 内部类 匿名类 (1)
- 数据库数据共享 (1)
- oracle存储过程 (1)
- 枚举类型 (1)
- 同步 (1)
- Spring MVC (1)
- concurrent (1)
- JAVA异常 (1)
- 观察者模式 (1)
- 通信协议 (1)
- mysql 百万级数据 (1)
- Timer TimerTask (1)
- java堆栈 (1)
- 负载均衡 (1)
- ORA-02291 (1)
- 存储过程 (1)
- velocity (1)
- dsa数字签名 (1)
- Linux (11)
- UTC时间 (1)
- git笔记 (1)
- postgresql (1)
- 性能吞吐量 (1)
- JNDI (1)
- 数据库并发控制 (1)
- MongoDB (8)
- socket.io (3)
- 数据结构 (1)
- zypper (1)
- wget (1)
- gradle (1)
- Linux常用命令大全 (2)
- Redis (10)
- JMeter (1)
- 跳表 (1)
- IO (1)
- rabbitmq (3)
- hadoop (1)
- esb (1)
- DRBD (1)
- HA高可用性 (1)
- 数据库备份 (1)
- Mysql集群 (2)
- Nginx (4)
- Session共享 (2)
- MongDB (1)
- JAVA (1)
- Mysql字符集 (1)
- solr (11)
- FTP (2)
- erlang (1)
- GraphicMagick (2)
- LVS (2)
- AJAXSUBMIT跨域 (1)
- 一致性哈希 (1)
- tomcat apr (1)
- 笔记 (1)
- freemarker (2)
- https原理 (1)
- DBCP数据源 (1)
- DHCP数据源 (1)
- ssh (2)
- FastDFS (1)
- XSS (1)
- CSRF (1)
- RSA (1)
- android (2)
- redis session (1)
- tomcat ssl (1)
- linux nginx (2)
- nginx ssl (1)
- linux ln (1)
- LVS keepalived (1)
- dubbox (1)
- JNI (1)
- zookeeper (1)
- storm (2)
- XXL-JOB (1)
最新评论
-
neusoft_jerry:
好东西,mark下!感谢楼主!
记一次线上Java程序导致服务器CPU占用率过高的问题排除过程(转载) -
460544406:
[color=red][/color]66
LINUX新建用户,并指定目录,无下载和上传权限(转载) -
soho00147:
结果错误,应该是A: {1,2,3,3,4,5}B: {3,4 ...
集合操作工具类CollectionUtils -
4711363:
能把修改的源码发我一下吗?碰到一些问题,谢谢。4711363@ ...
Redis存储Tomcat集群的Session出现race condition问题解决办法 -
CurrentJ:
直接用spring-session-redis组件。
Redis存储Tomcat集群的Session出现race condition问题解决办法
那么如何解决呢?
1)加入同步
2)加入等待和唤醒
先来看看加入同步会是如何。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
class Info {
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public int getAge() {
return age;
}
public void setAge( int age) {
this .age = age;
}
public synchronized void set(String name, int age){
this .name=name;
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
this .age=age;
}
public synchronized void get(){
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
System.out.println( this .getName()+ "<===>" + this .getAge());
}
private String name = "Rollen" ;
private int age = 20 ;
} /** * 生产者
* */
class Producer implements Runnable {
private Info info = null ;
Producer(Info info) {
this .info = info;
}
public void run() {
boolean flag = false ;
for ( int i = 0 ; i < 25 ; ++i) {
if (flag) {
this .info.set( "Rollen" , 20 );
flag = false ;
} else {
this .info.set( "ChunGe" , 100 );
flag = true ;
}
}
}
} /** * 消费者类
* */
class Consumer implements Runnable {
private Info info = null ;
public Consumer(Info info) {
this .info = info;
}
public void run() {
for ( int i = 0 ; i < 25 ; ++i) {
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
this .info.get();
}
}
} /** * 测试类
* */
class hello {
public static void main(String[] args) {
Info info = new Info();
Producer pro = new Producer(info);
Consumer con = new Consumer(info);
new Thread(pro).start();
new Thread(con).start();
}
} |
【运行结果】:
Rollen<===>20
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
Rollen<===>20
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
ChunGe<===>100
从运行结果来看,错乱的问题解决了,现在是Rollen 对应20,ChunGe对于100
,但是还是出现了重复读取的问题,也肯定有重复覆盖的问题。如果想解决这个问题,就需要使用Object类帮忙了、
,我们可以使用其中的等待和唤醒操作。
要完成上面的功能,我们只需要修改Info类饥渴,在其中加上标志位,并且通过判断标志位完成等待和唤醒的操作,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
class Info {
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public int getAge() {
return age;
}
public void setAge( int age) {
this .age = age;
}
public synchronized void set(String name, int age){
if (!flag){
try {
super .wait();
} catch (Exception e) {
e.printStackTrace();
}
}
this .name=name;
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
this .age=age;
flag= false ;
super .notify();
}
public synchronized void get(){
if (flag){
try {
super .wait();
} catch (Exception e) {
e.printStackTrace();
}
}
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
System.out.println( this .getName()+ "<===>" + this .getAge());
flag= true ;
super .notify();
}
private String name = "Rollen" ;
private int age = 20 ;
private boolean flag= false ;
} /** * 生产者
* */
class Producer implements Runnable {
private Info info = null ;
Producer(Info info) {
this .info = info;
}
public void run() {
boolean flag = false ;
for ( int i = 0 ; i < 25 ; ++i) {
if (flag) {
this .info.set( "Rollen" , 20 );
flag = false ;
} else {
this .info.set( "ChunGe" , 100 );
flag = true ;
}
}
}
} /** * 消费者类
* */
class Consumer implements Runnable {
private Info info = null ;
public Consumer(Info info) {
this .info = info;
}
public void run() {
for ( int i = 0 ; i < 25 ; ++i) {
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
this .info.get();
}
}
} /** * 测试类
* */
class hello {
public static void main(String[] args) {
Info info = new Info();
Producer pro = new Producer(info);
Consumer con = new Consumer(info);
new Thread(pro).start();
new Thread(con).start();
}
} |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
【程序运行结果】: Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
ChunGe<===> 100
Rollen<===> 20
先在看结果就可以知道,之前的问题完全解决。 |
发表评论
-
Java线程(九):Condition-线程通信更高效的方式(转载)
2014-10-31 13:06 667接近一周没更新《Java线程》专栏了,主要 ... -
Java线程(八):锁对象Lock-同步问题更完美的处理方式(转载)
2014-10-31 13:06 687Lock是java.util.concurre ... -
Java线程(七):Callable和Future(转载)
2014-10-31 13:05 577接着上一篇继续并发包的学习,本篇说明的 ... -
Java线程(六):线程池(转载)
2014-10-31 13:04 431自JDK5之后,Java推出了一个并发 ... -
Java线程(五):Timer和TimerTask(转载)
2014-10-31 13:04 734Timer和TimerTask可以做为实现线程 ... -
Java线程(四):线程中断、线程让步、线程睡眠、线程合并(转载)
2014-10-30 16:40 700本文来自:高爽|Coder,原文地址:htt ... -
Java线程(三):线程协作-生产者/消费者问题(转载)
2014-10-30 16:37 586上一篇讲述了线程的互斥(同步),但是在很多 ... -
Java线程(二):线程同步synchronized和volatile(转载)
2014-10-30 16:37 579上篇通 过一个简单的例子说明了线程安全与不安全, ... -
Java线程(一):线程安全与不安全(转载)写的有点偏题
2014-10-30 16:36 406作为一个Java web开发人员,很少也不 ... -
java多线程(转载)二
2012-12-10 15:04 983 -
java多线程(转载)一
2012-12-10 14:09 982在java中要想实现多线程,有两种手段,一种是继续Thr ...
相关推荐
1.8版还有更多新特性 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/27069
【Java 实现局域网聊天软件...综上所述,构建一个Java实现的局域网聊天软件涉及众多技术,包括Java网络编程、多线程、IO流、Spring Boot框架、WebSocket、JSON数据交换等,开发者需要对这些知识有深入理解和实践能力。
首先,多线程是Java中的一个关键特性,它允许程序同时执行多个任务,提高系统的效率和响应性。Java提供了多种方式来创建和管理线程,如通过实现Runnable接口或继承Thread类。理解线程生命周期(新建、就绪、运行、...
5. **多线程**:Java提供了内置的多线程支持,通过Thread类和Runnable接口可以创建并管理线程。理解线程同步(如synchronized关键字和Lock接口)以及并发工具类(如ExecutorService和Future)是处理并发问题的关键。...
java基于socket聊天室源代码.rar 注:供java socket编程的初学者学习使用,严禁用作作业抄袭和商业用途。若转载源代码,请注明原作者以及作者的博客地址。 项目名称:...单播,解决了多线程同步的问题。
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》:周志明的书,深入讲解JVM内存模型和多线程,对并发编程有较大帮助。 - 《Java EE 6 权威指南.基础篇.Basic concepts》:尽管现代开发更多依赖Spring等框架,...
3. **用户交互**:增加更多的用户交互功能,比如允许用户调整小球的颜色、速度等。 4. **代码规范**:遵循Java编码规范,提高代码可读性和维护性,例如正确缩进、合理命名变量和方法等。 通过以上分析可以看出,该...
NIO允许单线程处理多个通道,提高了服务器端并发性能。 8. **文件操作** Java的File类提供了对文件和目录的操作,如创建、删除、重命名等。FileInputStream和FileOutputStream用于读写文件,而FileReader和...
6. **多线程**:学习如何创建和管理线程,理解同步机制,如synchronized关键字、wait()、notify()等。通过习题,可以实践多线程编程,解决并发问题。 7. **反射**:掌握Java反射机制,能够动态地获取类的信息并调用...
并发编程的意义及影响多线程的因素 并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。 影响多线程运行速度的原因有线程创建开销、上下文切换、死锁,以及硬件和软件...
2. **线程**:为了实现抽奖过程的实时性和流畅性,软件通常会使用多线程。Java提供了Thread类和Runnable接口来创建和管理线程。在这个案例中,可能会有一个线程负责用户界面的更新,另一个线程负责抽奖逻辑,确保...
3. 多线程:介绍线程的创建和管理,线程同步机制,如synchronized关键字,wait和notify方法,以及线程池的使用。 4. 反射:讨论Java反射机制,它允许程序在运行时访问和修改类的行为,是框架开发中的重要技术。 5....
Java作为一门广泛使用的编程语言,其面试题涵盖了众多的知识领域,包括基础语法、面向对象、集合框架、多线程、异常处理、IO流、网络编程、设计模式、JVM优化、数据库操作等。以下是一些Java面试中常被问到的知识点...
在IT行业中,Java是一种广泛使用、面向对象的编程语言,以其跨平台、多线程和安全性著称。而Java 9作为Java语言的第九个主要版本,于2017年9月21日发布,它不仅包含了语言上的新特性,还包含了JDK(Java开发工具包)...
与CGI(Common Gateway Interface)相比,Servlet 运行在服务器的进程中,通过多线程方式处理请求,因此效率更高,因为不需要为每个请求创建新的进程。Servlet 实例通常在整个应用运行期间保持活动状态,这使其能够...
11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 思考题 363 第3部分 jsp篇 第12章 ...
声明:未经允许,请勿转载 本程序是针对超级玛丽小游戏的 JAVA 程序,进入游戏后首先用鼠标点击 GUI 窗口,然后开始游 戏...利用多线程技术,给游戏分别添加背景音乐、 跳跃音乐、死亡音乐、顶金币音乐、游戏胜利音乐。
1、供java socket编程的初学者学习使用,严禁用作作业抄袭和商业用途。若转载源代码,请注明原作者以及作者的博客地址。 2、TCPChatRoomServer(服务器端),TCPChatRoomClient...单播,解决了多线程同步的问题。