多线程11_张孝祥 java5的线程锁技术
本例子因为两个线程公用同线程中,使用同一个对象,实现了他们公用一把锁,实现了同一个方法的互斥。
package locks; /**
*会被打乱的效果
*/
public class LockTest2 { public static void main(String[] args) {
new LockTest2().init();
} private void init() {
//两个线程同时使用同一个Outputer对象,来确保他们使用的是同一把锁
final Outputer outputer = new Outputer(); new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//启动一个线程 调用方法 打印如下代码
outputer.output("zhangxiaoxiang");
} }
}).start(); new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//在启动一个线程 调用方法 打印 如下代码
outputer.output("lileilei");
} }
}).start();
}
// 两个线程调用方法的过程中,不能彼此干扰 class Outputer { public void output(String name) { try {
int len = name.length();
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
}
} //红色区域是发生打乱的效果
//iaoxiang
//zhangxiaoxiang
//lileilei
//zhangxiaoxialnig
//leilei
//lzihangxiaoxianlg
//eilei
//lilezhaniglxeii
//aoxiang
//zhangxiaoxianglileilei
//
//zhangxiaoxiang
//lileilei
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//zhlileilei
//angxiaoxiang
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiangli
//leilei
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//lileizhangxiaoxiang
//lei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
package locks; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
*不会被打乱的效果
*/
public class LockTest { public static void main(String[] args) {
new LockTest().init();
} private void init() {
//两个线程同时使用同一个Outputer对象,来确保他们使用的是同一把锁
final Outputer outputer = new Outputer();
// 两个线程调用同一个方法的过程中,不能彼此干扰
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//启动一个线程 调用方法 打印如下代码
outputer.output("zhangxiaoxiang");
} }
}).start(); new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//在启动一个线程 调用方法 打印 如下代码
outputer.output("lileilei");
} }
}).start();
} class Outputer { Lock lock=new ReentrantLock();
//通过锁,可以确保同一时间只有一个线程可以调用此方法
public void output(String name) { // 当A线程进入此方法的时候, 如果B也进来,发现A占用次锁, B需要等待该锁被释放才能继续往下执行,
lock.lock();//加一把所
System.out.print(Thread.currentThread().getName()+" ");
try {
int len = name.length();
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}finally{ lock.unlock();//解锁
}
}
}
}
//不被打乱的效果
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//lileilei
//zhangxiaoxiang
//lileilei
多线程11_张孝祥 java5的线程锁技术的更多相关文章
- Android多线程研究(9)——线程锁Lock
在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活 ...
- JAVA多线程提高八:线程锁技术
前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...
- JAVA多线程学习十一-线程锁技术
前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...
- 多线程12_张孝祥 java5读写锁技术的妙用
package locks; import java.util.Random; import java.util.concurrent.locks.ReentrantReadWriteLock; /* ...
- JDK5什么是新的线程锁技术(两)
一个. Lock线程同步实现互斥 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也是一个对象. 两个线程运行的代码片段要实现同步相互排斥的效果.他们必须用 ...
- java--加强之 Java5的线程并发库
转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9945499 01. 传统线程技术回顾 创建线程的两种传统方式: 1.在Thread子类覆盖的r ...
- java线程(4)——线程同步的锁技术
同步 同步,字面来看,有点一起工作的意思.但在线程同步中,"同"意为协同.互相配合. 比如: A.B两个线程,并不是说两个线程必须同时一起工作,而是说互相配合工作,在某个时间可能线 ...
- Java多线程面试题:线程锁+线程池+线程同步等
1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...
随机推荐
- 逆向x64-small-trick
在逆向一些x64的代码时,会发现有一小段汇编代码理解不了,这个时候回想,要是能单独执行这一小段汇编就好了.现在我就介绍一个我的解决方法:很小汇编一段代码,但是不好理解,我就把它单独写成了一个函 ...
- aps.net js获取服务器控件
document.getElementById("<%= tx_ownerId.ClientID %>").value;
- SharePoint 2013 代码实现自定义的站点模版创建Site Collection
先需要将自定义的站点模版从网站集转移到Farm中. 找一个自己已经完成配置及设计的网站,在网站设置里面选择另存为模版.要注意的是不是所有的站点类型都有另存为模版的功能. 存完之后可在解决方案库的界面里 ...
- Sql遍历数据库
Sql遍历数据库 set nocount on ) ) ) set @str='ad' Declare cur_Depart Cursor For select name,id from syscol ...
- (转载)log4net 组件详解
1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是介绍如何在Visual S ...
- asp.net 获取IP地理位置的几个主要接口
腾讯的IP地址API接口地址:http://fw.qq.com/ipaddress 新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup ...
- C++中数字与字符串之间的转换,别人的,
C++中数字与字符串之间的转换 1.字符串数字之间的转换 (1)string --> char * string str("OK"); char * p = st ...
- 图的深度优先遍历(DFS) c++ 非递归实现
深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...
- UNIX环境高级编程--#include "apue.h"
apue.h头文件为作者自己编写而非系统自带,故需要自行添加! 第一:打开网站 http://www.apuebook.com/第二:选择合适的版本(一共有三个版本,根据书的版本选择)下载源码sour ...
- 使用cvReleaseImage()释放图像出错
前几天用opencv写程序的时候,在用cvReleaseImage()函数释放cvLoadImage()加载的图像的时候出错,如下所示: IplImage *src = cvLoadImage(fil ...