java 多线程 张孝祥_多线程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

Android多线程研究(9)——线程锁Lock

在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活 ...

JAVA多线程提高八&colon;线程锁技术

前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...

多线程12&lowbar;张孝祥 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多线程面试题:线程锁&plus;线程池&plus;线程同步等

1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...

python&lowbar;way &comma;day11 线程&comma;怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

多线程&lpar;五&rpar; java的线程锁

在多线程中,每个线程的执行顺序,是无法预测不可控制的,那么在对数据进行读写的时候便存在由于读写顺序多乱而造成数据混乱错误的可能性.那么如何控制,每个线程对于数据的读写顺序呢?这里就涉及到线程锁. 什么 ...

随机推荐

UCMA设置lync在线状态

摘要 UCMA全称Microsoft Unified Communications Managed API,主要用来构建工作在Microsoft Lync Server上的中间层应用程序.开发人员可以 ...

c&num; List 按类的指定字段排序

List list=Report.FindAllbyClassID(id); ) { list.Sort(delegate(Report x,Report y){ret ...

Limiting To Select Only 5 Check Boxes Out Of Ten In Oracle Forms

Suppose you want to give an option to user to select only 5 check boxes from given any number of che ...

九款酷炫基于jquery实现的应用及源码

1.HTML5 Loading动画加载 五彩的圆环Loading 今天我们要分享一款基于HTML5的Loading加载动画特效,这款HTML5加载动画是一个五彩的圆环,圆环不停地转动从而体现加载正在进 ...

Android 自学之列表视图ListView和ListActivity

ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项. 创建ListView有两种方式: 直接使用ListView创建. 让Activity继承ListActivity ...

oracle update语句的几点写法

update两表关联的写法包括字查询 1.update t2 set parentid=(select ownerid from t1 where t1.id=t2.id); 2. update tb ...

linux下的Shell编程(8)自定义函数

Shell Script中也可以使用自定义的函数,其语法形式如下: functionname() { - }

HTML与CSS的一些知识(二)

续: 5.表单标签

用于收集用户信息,统一提交到服务器 一般用input标签收集,再用提交按钮提交:input标签根据type属性值不同有不同的类型: ...

Mybatis 中 columnPrefix别名的用法

1.映射对应的属性,区分他们分别属于哪些类.(sql书写的时候为什么要将前缀加上(别名),是因为便于它去寻找哪个类的前缀是ANNEX_) 2.例:  如下所示当一个collection 定义了一个co ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于多线程编程,ThreadLocal类是一个非常有用的工具。它提供了线程本地变量的机制,使得每个线程都可以独立地存储和获取自己的变量副本。这在一些场景下非常有用,下面是一些ThreadLocal类的应用技巧: 1. 线程上下文信息传递:在多线程环境中,有时需要在线程之间传递一些上下文信息,例如用户身份认证信息、语言环境等。使用ThreadLocal类可以很方便地实现这一目的,每个线程都有自己独立的上下文信息副本,互不干扰。 2. 线程安全的数据存储:在多线程环境中,如果多个线程需要共享一份数据,可以使用ThreadLocal类来维护每个线程的局部副本。这样每个线程都可以独立地修改自己的副本,而不会影响其他线程的数据。 3. 避免传参:有些情况下,我们需要在多个方法之间传递某些参数,但是参数传递会增加代码复杂性。使用ThreadLocal类可以避免传参,每个方法可以直接从ThreadLocal中获取需要的参数值。 4. 事务管理:在一些事务场景中,我们可能需要在同一个线程中执行多个数据库操作,并保证这些操作在同一个数据库事务中。使用ThreadLocal类可以在线程中维护一个数据库连接对象,确保多个操作都使用同一个连接,实现事务的一致性。 需要注意的是,ThreadLocal类虽然提供了线程本地变量的机制,但并不是万能的解决方案。在使用ThreadLocal时,需要注意内存泄漏的问题,及时清理不再使用的资源。 希望以上内容对您有帮助!如需了解更多多线程编程相关内容,可以参考CSDN中张孝祥的相关文章。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值