- 浏览: 216105 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
junzi2013:
df
黑马程序员:MyEclipse9 常用快捷键 中英文对照 及 快速get set方法 -
junzi2013:
dfsdafadsfsd
黑马程序员:MyEclipse9 常用快捷键 中英文对照 及 快速get set方法 -
idealab:
博主说的OpenCSV, JavaCSV, SuperCSV都 ...
csv调研 -
tanxin:
楼主怎么解决这个问题的呢?
坑爹的zookeer -
yy22258867:
:twisted:
黑马程序员19-7:foreach遍历核心源码,遍历HashMap需要用map.keySet()或map.entrySet()
package com.lee.thread; public class TraditionalThreadSynchronized { public static void main(String[] args) { //静态方法中不能new内部类的实例对象 new TraditionalThreadSynchronized().init(); } private void init(){ final Outputer outputer = new Outputer(); //线程1 new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); } outputer.output("zhangxiaoxiang"); } } }).start(); //线程2 new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); } outputer.output("lihuoming"); } } }).start(); } class Outputer{ public void output(String name){ int len = name.length(); for(int i = 0; i < len; i++){ System.out.print(name.charAt(i)); } System.out.println(); } } }
线程1和线程2在外部类的init方法中,同时开启了,两个线程夺取内部类的资源,于是会出现线程1夺取一半时,线程2过来夺取。而本意是想,线程1执行一个,线程2执行一个。
输出结果如下:
zhangxiaoxlihuoming iang lihuozhanming gxiaoxiang lihuoming zhangxiaoxiang lihuoming zhangxiaoxiang lihzhangxiaoxiang uoming lihuozhming
因此,出现了所谓的线程安全隐患。
保证原子性,需要给并发的代码块加锁。
不过下面的方式是错误的
class Outputer{ public void output(String name){ synchronized (name) { int len = name.length(); for(int i = 0; i < len; i++){ System.out.print(name.charAt(i)); } System.out.println(); } } }
synchronized里边的是一个栓子,应该是所有线程对象都用的是同一个栓子才可以达到互斥的效果。上面的写法,每个线程都有自己的传过来的不同的name,因此,起不到互斥效果。
输出效果如下:
ang lihuoming zhangxiaoxiang lihuoming zhangxiaoxiang lizhangxiaoxiang huoming lihuomzhangxiaoxiang ing
因此,实现互斥的锁,应该是每个线程都持有的一样的一把锁(这把锁必须是同一个对象的,如果每个线程都new了一个Outputer就不能实现互斥了,因为不是同一个对象),因此,可以在类中定义一个String s,那么每个在使用这个类时,使用的锁都是s锁,可以实现互斥的效果。
class Outputer{ String s = "xxx"; public void output(String name){ synchronized (s) { int len = name.length(); for(int i = 0; i < len; i++){ System.out.print(name.charAt(i)); } System.out.println(); } } }
输出结果如下:
lihuoming lihuoming zhangxiaoxiang lihuoming zhangxiaoxiang zhangxiaoxiang lihuoming zhangxiaoxiang lihuoming lihuoming zhangxiaoxiang zhangxiaoxiang
可以使用当前对象this作为锁,这样也可以实现互斥,因为他们都是来自同一个唯一的new出来的对象。
class Outputer{ public void output(String name){ synchronized (this) { int len = name.length(); for(int i = 0; i < len; i++){ System.out.print(name.charAt(i)); } System.out.println(); } } }
当两个线程分别调用下面两个方法的时候,也可以实现互斥的效果,因为这两个方法都是使用this作为锁。
public void output(String name){ synchronized (this) { int len = name.length(); for(int i = 0; i < len; i++){ System.out.print(name.charAt(i)); } System.out.println(); } } public synchronized void output2(String name){ { int len = name.length(); for(int i = 0; i < len; i++){ System.out.print(name.charAt(i)); } System.out.println(); } }
输出结果如下:
zhangxiaoxiang lihuoming zhangxiaoxiang lihuoming zhangxiaoxiang lihuoming
静态时,不与锁关系,但是最好还是加
static class Outputer { public void output(String name) { synchronized (Outputer.class) { int len = name.length(); for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } } public synchronized void output2(String name) { { int len = name.length(); for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } } public static synchronized void output3(String name) { { int len = name.length(); for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } } }
发表评论
-
Java中的IO整理完整版
2013-02-15 17:23 663http://developer.51cto.com/art/ ... -
Myeclipse中导入zip文件查看源代码
2012-09-21 23:35 1001用Myeclipse的时候,出现无法查看源码的话,导入jdk文 ... -
==与equals
2012-09-13 20:15 595一般基本数据类型的比较用 == 当涉及到对象、字符串的时候,就 ... -
多线程课程002:线程范围内的共享变量
2012-09-13 16:47 907package cn.itcast.heima2; ... -
多线程课程001:线程安全的问题
2012-09-13 14:37 773下面的做法,会发现输出结果被打断了。 package co ... -
内部类的实际应用
2012-09-13 11:01 623public class TraditionalThreadS ... -
Java接口
2012-09-11 12:07 725Java接口的方法只能是抽象的和公开的,Java接口不能有构造 ... -
移位运算符
2012-09-11 09:31 807移位运算符 <<左移 a<<b,a转 ... -
【总结】gridbaglayout布局管理器
2012-08-15 11:19 660http://blog.sina.com.cn/s/blog_ ... -
【练习_00010】java不重复随机数
2012-08-14 01:26 656package com.heima.test; impo ... -
【练习】判断一个字符串中某些字段出现的次数
2012-08-14 01:08 935package com.heima.test; im ... -
选择、冒泡、折半排序查找方法
2012-08-13 15:06 1175import java.util.Arrays; i ... -
自己写的杨辉三角
2012-08-12 16:41 768package com.lee.graphic; p ... -
交换两个数的位置,不用中间变量
2012-08-06 02:28 1078a ^= b; b ^= a; a ^= b; 1 ... -
未解问题,定时器无法自定义切换时间
2012-07-30 18:08 976package com.heima.test004.enu ... -
黑马程序员:设计模式,享元模式flyweight
2012-07-23 02:13 0如果有很多很小的东西,对象,当他们有很多属性是相同的,就可以把 ... -
黑马程序员:for综合图形整合结晶
2012-07-23 01:16 773package Graph; public clas ... -
JS: js获取字符串长度
2012-07-20 18:01 0<SCRIPT LANGUAGE="Jav ... -
传智27-2: 模拟Tocat浏览器,写网页蜘蛛爬虫,抓取网页信息
2012-07-12 17:03 0package cn.itcast.net.p2.ie_s ... -
传智27-1:多线程上传图片,阻塞防止while空转
2012-07-12 16:59 0package cn.itcast.net.p1.uplo ...
相关推荐
解决多线程编程中的同步互斥问题
学习目录:1. 线程简介 2. 线程实现(重点) 3. 线程状态 4. 线程同步(重点) 5. 线程通信问题 6. 高级主题
这是源自于英特尔软件网络的多线程技术资料,其中详细汇集了多线程编程方法的综述,Linux/Unix多线程编程,Windows多线程编程,以及多线程程序设计中的常见问题及解决途径。
此资源集包含了一套完整的Java实现的多线程与线程安全实践项目源代码、相关的毕业论文以及详尽的使用说明。它旨在提供一个全面、深入的学习和研究工具,适用于本科课程设计、毕业设计以及任何希望深入学习Java编程的...
操作系统课程设计报告 实现多线程通信同步互斥内存管理文件管理 图文并茂。
课程大作业啊,绝对真实,用多线程技术实现的,对初学多线程技术的童鞋绝对有帮助,亲,还不下载等什么呢
对理发师问题进行描述,采用多线程控制 内涵源码,在linux下可运行(有截图) 也包含课程设计的原文。
本资源包“Java多线程与线程安全实践-基于Http协议的断点续传....通过这个实践项目,学生不仅能够加深对Java多线程和线程安全概念的理解,还能提升解决实际问题的能力,为未来的软件开发工作打下坚实的基础。重新回答||
目录网盘文件永久链接 01课程安排av 02什么是并发和并行av 03什么是进程和线程avi 04.线程创建继承 thread美avi 05线程创建实现 Runnable接口avi ...12线程安全问题线程安全问题演示avi ...............
多线程高并发中高级工程师进阶课程,讲述多线程面试中常见问题,剑指offer中经典多线程题型汇总,注意只专注多线程模块
课程设计基于PyQt5+Python开发的远程医疗云监控系统源码+运行说明(多线程+Socket通信).tar课程设计基于PyQt5+Python开发的远程医疗云监控系统源码+运行说明(多线程+Socket通信).tar课程设计基于PyQt5+Python开发的...
标题:进阶课程之并发编程快速入门与多线程实战项目> 课程内容: 1.CPU调度算法原理(先来先服务、最短作业法、优先级调度算法) 2.站在字节码角度+cpu上下文切换角度分析线程安全问题 3.手写Callable与FutureTask...
基于ROS多线程订阅多个话题并且发布话题C++源码(含详细注释).zip基于ROS多线程订阅多个话题并且发布话题C++源码(含详细注释).zip基于ROS多线程订阅多个话题并且发布话题C++源码(含详细注释).zip基于ROS多线程订阅多...
1) 每个读者进入阅览室后,即时显示“Entered” 及其线程自定义标识,还同时显示阅览室共有几名顾客及其所坐的位置。 2) 至少有10个读者,每人阅览至少3秒钟。 3) 多个读者须共享操作函数代码。
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
java编写的小程序 操作系统课程设计 生产者消费者问题
基于epoll的包含线程池、定时器、日志的多进程多线程的WebServer服务器源码.zip基于epoll的包含线程池、定时器、日志的多进程多线程的WebServer服务器源码.zip基于epoll的包含线程池、定时器、日志的多进程多线程的...
基本满足操作系统课上要求,java实现的生产者消费者模型。
基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip C++ 调用 MYSQL API 连接池 ## environment: * VS2022 * MySQL8.0.27 ## 高并发下频繁处理瓶颈 * 建立通信:`TCP三次握手` * 数据库服务器的`连接认证...
技术要求: 1)为每个理发师/顾客产生一个线程,设计正确的同步算法 2)每个顾客进入理发室后,即时显示“Entered” 及其线程自定义标识,还同时显示理发室共有几名顾客及其所坐的...4)多个顾客须共享操作函数代码。