- 浏览: 551451 次
文章分类
- 全部博客 (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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/** * @author Rollen-Holt 线程的优先级
* */
class hello implements Runnable {
public void run() {
for ( int i= 0 ;i< 5 ;++i){
System.out.println(Thread.currentThread().getName()+ "运行" +i);
if (i== 3 ){
System.out.println( "线程的礼让" );
Thread.currentThread().yield();
}
}
}
public static void main(String[] args) {
Thread h1= new Thread( new hello(), "A" );
Thread h2= new Thread( new hello(), "B" );
h1.start();
h2.start();
}
} |
A运行0
A运行1
A运行2
A运行3
线程的礼让
A运行4
B运行0
B运行1
B运行2
B运行3
线程的礼让
B运行4
同步和死锁:
【问题引出】:比如说对于买票系统,有下面的代码:
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
|
/** * @author Rollen-Holt
* */
class hello implements Runnable {
public void run() {
for ( int i= 0 ;i< 10 ;++i){
if (count> 0 ){
try {
Thread.sleep( 1000 );
} catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(count--);
}
}
}
public static void main(String[] args) {
hello he= new hello();
Thread h1= new Thread(he);
Thread h2= new Thread(he);
Thread h3= new Thread(he);
h1.start();
h2.start();
h3.start();
}
private int count= 5 ;
} |
【运行结果】:
5
4
3
2
1
0
-1
这里出现了-1,显然这个是错的。,应该票数不能为负值。
如果想解决这种问题,就需要使用同步。所谓同步就是在统一时间段中只有有一个线程运行,
其他的线程必须等到这个线程结束之后才能继续执行。
【使用线程同步解决问题】
采用同步的话,可以使用同步代码块和同步方法两种来完成。
【同步代码块】:
语法格式:
synchronized(同步对象){
//需要同步的代码
}
但是一般都把当前对象this作为同步对象。
比如对于上面的买票的问题,如下:
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
|
/** * @author Rollen-Holt
* */
class hello implements Runnable {
public void run() {
for ( int i= 0 ;i< 10 ;++i){
synchronized ( this ) {
if (count> 0 ){
try {
Thread.sleep( 1000 );
} catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(count--);
}
}
}
}
public static void main(String[] args) {
hello he= new hello();
Thread h1= new Thread(he);
Thread h2= new Thread(he);
Thread h3= new Thread(he);
h1.start();
h2.start();
h3.start();
}
private int count= 5 ;
} |
【运行结果】:(每一秒输出一个结果)
5
4
3
2
1
【同步方法】
也可以采用同步方法。
语法格式为synchronized 方法返回类型方法名(参数列表){
// 其他代码
}
现在,我们采用同步方法解决上面的问题。
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
|
/** * @author Rollen-Holt
* */
class hello implements Runnable {
public void run() {
for ( int i = 0 ; i < 10 ; ++i) {
sale();
}
}
public synchronized void sale() {
if (count > 0 ) {
try {
Thread.sleep( 1000 );
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(count--);
}
}
public static void main(String[] args) {
hello he = new hello();
Thread h1 = new Thread(he);
Thread h2 = new Thread(he);
Thread h3 = new Thread(he);
h1.start();
h2.start();
h3.start();
}
private int count = 5 ;
} |
【运行结果】(每秒输出一个)
5
4
3
2
1
提醒一下,当多个线程共享一个资源的时候需要进行同步,但是过多的同步可能导致死锁。
此处列举经典的生产者和消费者问题。
【生产者和消费者问题】
先看一段有问题的代码。
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
|
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;
}
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.setName( "Rollen" );
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
this .info.setAge( 20 );
flag= false ;
} else {
this .info.setName( "chunGe" );
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
this .info.setAge( 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();
}
System.out.println( this .info.getName()+ "<---->" + this .info.getAge());
}
}
} /** * 测试类
* */
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<---->100
chunGe<---->20
chunGe<---->100
Rollen<---->100
chunGe<---->20
Rollen<---->100
Rollen<---->100
Rollen<---->100
chunGe<---->20
chunGe<---->20
chunGe<---->20
Rollen<---->100
chunGe<---->20
Rollen<---->100
chunGe<---->20
Rollen<---->100
chunGe<---->20
Rollen<---->100
chunGe<---->20
Rollen<---->100
chunGe<---->20
Rollen<---->100
chunGe<---->20
Rollen<---->100
chunGe<---->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 432自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 587上一篇讲述了线程的互斥(同步),但是在很多 ... -
Java线程(二):线程同步synchronized和volatile(转载)
2014-10-30 16:37 579上篇通 过一个简单的例子说明了线程安全与不安全, ... -
Java线程(一):线程安全与不安全(转载)写的有点偏题
2014-10-30 16:36 406作为一个Java web开发人员,很少也不 ... -
java多线程(转载)三
2012-12-10 15:20 1199那么如何解决呢? 1)加入同步 2)加入等待和唤醒 ... -
java多线程(转载)一
2012-12-10 14:09 982在java中要想实现多线程,有两种手段,一种是继续Thr ...
相关推荐
1.8版还有更多新特性 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/27069
2. **多线程处理**: - **并发处理**:在聊天软件中,通常需要同时处理多个客户端的连接和消息发送,因此多线程技术至关重要。Java提供了Thread类以及Runnable接口来支持多线程编程。 3. **IO流**: - **输入输出...
首先,多线程是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等框架,...
2. **性能优化**:对于大量计算的任务(如`move`方法中未使用的循环),应考虑将其放在独立的线程中执行,以免影响主程序的流畅度。 3. **用户交互**:增加更多的用户交互功能,比如允许用户调整小球的颜色、速度等...
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...单播,解决了多线程同步的问题。