从头认识java-18.6 synchronized在其它对象上同步和ThreadLocal来消除共享对象的同步问题
这一章节我们来介绍在其它对象上同步与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来消除共享对象的同步问题的更多相关文章
- 关于JAVA多线程并发synchronized的测试与合理使用
在项目开发中, 或许会碰到JAVA的多线程处理, 为保证业务数据的正常, 必须加上锁机制, 常用的处理方法一般是加上synchronized关键字, 目前JDK版本对synchronized已经做了 ...
- java 多线程9 : synchronized锁机制 之 代码块锁
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...
- 14 Java虚拟机实现 synchronized
java 中的 synchronized 运行 在 Java 中,我们经常用 synchronized 关键字对程序进行加锁.无论是一个代码块还是静态方法或者实例方法,都可以直接用 synchroni ...
- Java线程之Synchronized用法
synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...
- Java并发之synchronized关键字深度解析(三)
前言 本篇主要介绍一下synchronized的批量重偏向和批量撤销机制,属于深水区,大家提前备好氧气瓶. 上一篇说完synchronized锁的膨胀过程,下面我们再延伸一下synchronized锁 ...
- Java并发之synchronized关键字深度解析(二)
前言 本文继续[Java并发之synchronized关键字深度解析(一)]一文而来,着重介绍synchronized几种锁的特性. 一.对象头结构及锁状态标识 synchronized关键字是如何实 ...
- Java性能之synchronized锁的优化
synchronized / Lock 1.JDK 1.5之前,Java通过synchronized关键字来实现锁功能 synchronized是JVM实现的内置锁,锁的获取和释放都是由JVM隐式实现 ...
- 对kotlin和java中的synchronized的浅谈
synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12 ...
- Java关键字(八)——synchronized
synchronized 这个关键字,我相信对于并发编程有一定了解的人,一定会特别熟悉,对于一些可能在多线程环境下可能会有并发问题的代码,或者方法,直接加上synchronized,问题就搞定了. 但 ...
随机推荐
- a标签设置高度不生效问题
<a>是内联元素 必须设置成块级元素block 才能有width和height 不过你可以又定义display:block再定义成display:inline 以避免在IE6下产生BUG ...
- Mysql如何避免全表扫描的方法
在以下几种条件下,MySQL就会做全表扫描: 1>数据表是在太小了,做一次全表扫描比做索引键的查找来得快多了.当表的记录总数小于10且记录长度比较短时通常这么做. 2>没有合适用于 ON ...
- Android内存优化之封装九宫格
随着市场上越来越多的APP上线,好多软件对手机的内存要求也是很大,所以我们在开发的时候一定要掌握如何去优化内存,将自己的APP尽可能优化.今天我们就一起看一下九宫格的优化.下面是软件的截图 1.为了达 ...
- pintos操作系统thread部分的实现
pintos是斯坦福大学自己开发的一个教学用操作系统.里面的代码给我们留了很多坑.我们的目标就是解决这些坑!详细的实现大家能够看看这篇blog,尽管我的代码并非所有跟着他写的,可是这确实是一篇非常好地 ...
- web前端project师知识汇总
分类: Web开发应用 一.何为Web前端project师? 前端project师,也叫Web前端开发project师.他是随着web发展.细分出来的行业.Web前端开发proj ...
- linux修改history记录数
在linux系统下.history命令会保存多少条命令呢?曾在一本书上说,如果注销系统,那么会将所有的历史命令都定入到~/.bash_history, 但只保留1000条命令(这个是由默认的shell ...
- m_Orchestrate learning system---十八、mo项目的启示是什么
m_Orchestrate learning system---十八.mo项目的启示是什么 一.总结 一句话总结:多看教程,体统看教程的学, 完全不懂的话百度的作用也不大 多学点,可以节约后面的超多时 ...
- ICMP 隧道——将流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测
利用 ICMP 隧道穿透防火墙 转自:http://xiaix.me/li-yong-icmp-sui-dao-chuan-tou-fang-huo-qiang/ 以前穿透防火墙总是使用 SSH 隧道 ...
- validation-api参数校验
这里针对springboot项目结构 maven添加: <dependency> <groupId>javax.validation</groupId> <a ...
- VC6之MAP文件生成及格式
文件生成方式: 在 VC 中,我们可以按下 Alt+F7 ,打开“Project Settings”选项页,选择 C/C++ 选项卡,并在最下面的 Project Options 里面输入:/Zd , ...