从头认识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来消除共享对象的同步问题。

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

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

目录

时间: 2024-11-10 14:03:57

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

Java中利用synchronized关键字实现多线程同步问题

Java 中多线程的同步依靠的是对象锁机制,synchronized关键字就是利用了封装对象锁来实现对共享资源的互斥访问. 下面以一个简单例子来说明多线程同步问题,我们希望在run()方法里加入synchronized关键字来实现互斥访问. package com.clark.thread; public class MyThread implements Runnable{     private int threadId;          public MyThread(int id){

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

Java并发编程 Synchronized及其实现原理

Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法.Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题. Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 1.普通同步方法,锁是当前实例对象 public class SynchronizedTest { 4 public synchronized void method1(){ 5 System

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

synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用synchronized同步语句块来解决问题.看一下例子: 下面例子是优化后的例子 使用代码块锁,原先例子是方法锁,就是同步 必须要执行2个for  public class ThreadDomain18 { public void doLongTimeTask() throws Exception

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

在项目开发中, 或许会碰到JAVA的多线程处理, 为保证业务数据的正常, 必须加上锁机制,  常用的处理方法一般是加上synchronized关键字, 目前JDK版本对synchronized已经做了很好的优化,  我们不用再考虑其性能,  但在实际使用中,  往往由于处理不当,  导致系统性能的严重下降, 那么该如何合理的使用synchronized,  必须对其使用方式有个全面了解, 在网上搜寻的资料, 给出的是四种使用方式, 其实可总结为两种, 一个是同步代码块, 一个是同步方法体, 那么

14 Java虚拟机实现 synchronized

java 中的 synchronized 运行 在 Java 中,我们经常用 synchronized 关键字对程序进行加锁.无论是一个代码块还是静态方法或者实例方法,都可以直接用 synchronized 声明. 当声明 synchronized 代码块时,编译的字节码将包含 monitorenter 和 monitorexit 指令.这两种指令均会消耗操作数栈上的一个引用类型的元素,作为所要加锁解锁的锁对象. public void foo(Object lock) { synchroniz

Java性能之synchronized锁的优化

synchronized / Lock 1.JDK 1.5之前,Java通过synchronized关键字来实现锁功能 synchronized是JVM实现的内置锁,锁的获取和释放都是由JVM隐式实现的 2.JDK 1.5,并发包中新增了Lock接口来实现锁功能 提供了与synchronized类似的同步功能,但需要显式获取和释放锁 3. Lock同步锁是基于Java实现的,而synchronized是基于底层操作系统的Mutex Lock实现的 每次获取和释放锁都会带来用户态和内核态的切换,从

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

前言 本篇主要介绍一下synchronized的批量重偏向和批量撤销机制,属于深水区,大家提前备好氧气瓶. 说完synchronized锁的膨胀过程,下面我们再延伸一下synchronized锁的两种特殊处理,一种是锁的批量重偏向,一种是锁的批量撤销.JVM中有两个参数,BiasedLockingBulkRebiasThreshold和BiasedLockingBulkRevokeThreshold,前者默认阈值为20,控制批量重偏向:后者默认阈值为40,控制批量撤销.下面我们分别看一下它们是如

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

前言 本文继续[Java并发之synchronized关键字深度解析(一)]一文而来,着重介绍synchronized几种锁的特性. 一.对象头结构及锁状态标识 synchronized关键字是如何实现的给对象加锁?首先我们要了解一下java中对象的组成.java中的对象由3部分组成,第一部分是对象头,第二部分是实例数据,第三部分是对齐填充. 对齐填充:jvm规定对象的起始内存地址必须是8字节的整数倍,如果不够的话就用占位符来填充,此部分占位符就是对齐填充: 实例数据:实例数据是对象存储的真正有