这一章节我们来介绍在其它对象上同步与ThreadLocal。

前一章节我们使用了

1.synchronized在其它对象上同步

class ThreadA implements Runnable {
private Object object = new Object(); private synchronized void test() throws InterruptedException {
System.out.println("dosomething");
Thread.sleep(5000);
synchronized (object) {
System.out.println("dosomething");
}
} @Override
public void run() {
while (true) {
try {
test();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

2.ThreadLocal来消除共享对象的同步问题

package com.ray.ch18;

public class Test {

	public static void main(String[] args) {
new Thread(new Accessor(new ThreadLocalVarHoder())).start();
new Thread(new Accessor(new ThreadLocalVarHoder())).start();
new Thread(new Accessor(new ThreadLocalVarHoder())).start();
}
} class Accessor implements Runnable {
private ThreadLocalVarHoder threadLocalVarHoder; public Accessor(ThreadLocalVarHoder threadLocalVarHoder) {
this.threadLocalVarHoder = threadLocalVarHoder;
} @Override
public void run() {
for (int i = 0; i < 3; i++) {
threadLocalVarHoder.increment();
System.out.println(Thread.currentThread().getName() + " "
+ threadLocalVarHoder.get());
}
} } class ThreadLocalVarHoder {
private static ThreadLocal<Integer> value = new ThreadLocal<Integer>() {
protected Integer initialValue() {
return 0;
}
}; public void increment() {
value.set(value.get() + 1);
} public int get() {
return value.get();
}
}

输出:

Thread-0 1
Thread-0 2
Thread-0 3
Thread-1 1
Thread-2 1
Thread-2 2
Thread-2 3
Thread-1 2
Thread-1 3

从上面的输出能够看见。每个线程都是读取自己线程上面的副本的值,它的改动这些不涉及原来的对象。

总结:这一章节简介了synchronized在其它对象上同步和ThreadLocal来消除共享对象的同步问题。

这一章节就到这里,谢谢。

-----------------------------------

文件夹

从头认识java-18.6 synchronized在其它对象上同步和ThreadLocal来消除共享对象的同步问题的更多相关文章

  1. 关于JAVA多线程并发synchronized的测试与合理使用

    在项目开发中, 或许会碰到JAVA的多线程处理, 为保证业务数据的正常, 必须加上锁机制,  常用的处理方法一般是加上synchronized关键字, 目前JDK版本对synchronized已经做了 ...

  2. java 多线程9 : synchronized锁机制 之 代码块锁

    synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...

  3. 14 Java虚拟机实现 synchronized

    java 中的 synchronized 运行 在 Java 中,我们经常用 synchronized 关键字对程序进行加锁.无论是一个代码块还是静态方法或者实例方法,都可以直接用 synchroni ...

  4. Java线程之Synchronized用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...

  5. Java并发之synchronized关键字深度解析(三)

    前言 本篇主要介绍一下synchronized的批量重偏向和批量撤销机制,属于深水区,大家提前备好氧气瓶. 上一篇说完synchronized锁的膨胀过程,下面我们再延伸一下synchronized锁 ...

  6. Java并发之synchronized关键字深度解析(二)

    前言 本文继续[Java并发之synchronized关键字深度解析(一)]一文而来,着重介绍synchronized几种锁的特性. 一.对象头结构及锁状态标识 synchronized关键字是如何实 ...

  7. Java性能之synchronized锁的优化

    synchronized / Lock 1.JDK 1.5之前,Java通过synchronized关键字来实现锁功能 synchronized是JVM实现的内置锁,锁的获取和释放都是由JVM隐式实现 ...

  8. 对kotlin和java中的synchronized的浅谈

    synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12 ...

  9. Java关键字(八)——synchronized

    synchronized 这个关键字,我相信对于并发编程有一定了解的人,一定会特别熟悉,对于一些可能在多线程环境下可能会有并发问题的代码,或者方法,直接加上synchronized,问题就搞定了. 但 ...

随机推荐

  1. h5性能优化,细节决定结果。

    介绍一些最近整理的优化细节.图片压缩什么的就不说了,这是优化必须做的.今天就说一下大家写代码时可以培养的优化的细节点. 不滥用float.不滥用web字体. Float在渲染时计算量比较大,并且会脱标 ...

  2. 小学生都能学会的python(闭包和迭代器)

    小学生都能学会的python(闭包和迭代器) 1. 函数名第一类对象 函数名其实就是变量名 1). 可以像变量一样互相赋值. 2). 可以作为函数的参数,进行传递 3). 可以作为返回值返回 4). ...

  3. SpringCloud 构建微服务架构-练习

    我使用的springboot的版本为2.0.2.RELEASE,这里概念性的东西我就不粘贴复制了,百度一下 都是 一.启动Eureka注册中心服务 1.新建springboot项目,pom.xml配置 ...

  4. MyBatis学习总结(4)——解决字段名与实体类属性名不相同的冲突

    一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...

  5. poj2492--A Bug&#39;s Life(并查集变形)

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 28703   Accepted: 9350 De ...

  6. nodejs即时聊天

    一直想做一个即时聊天的应用,前几天看到了socket.io,感觉还不错.自己略加改动,感觉挺不错的.官网上给的样例非常easy,以下改进了一点,实现了历史消息的推送. demo地址:chat.code ...

  7. 模拟实现Spring IoC功能

    为了加深理解Spring 今天自己写了一个模拟的Spring.... 步骤: 1.利用jdom解析bean.xml(pull,sax也能够,我这里用了jdom) 2.先解析全部的<bean/&g ...

  8. c++:数据类型的推断type_traits

    //推断左值右值引用 void main() { int i(10);//i是左值 有内存实体 int &ri(i); int &&rri(i + 5);//右值引用 cout ...

  9. html 标签: image也能提交form!!!

    html 标签: image也能提交form! !! image也能提交form 先前常常使用"<input type="submit" value="i ...

  10. Linux内核编译測试

    内核编译: Step 1:配置内核编译选项. make menuconfig Optional Step :排除编译结果文件(.o)等之间的依赖性. make mrproper Optional St ...