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


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

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

    文件夹


  • 相关阅读:
    【MongoDB】 C#官方驱动增删查改
    【MongoDB】MongoHelper
    【设计模式】简单的单例模式
    andriod深度探索及驱动开发展望
    搭建Android开发环境
    第一章Android系统移植与驱动开发概述
    时间
    django-admin和manage.py
    自定义django-admin命令
    会话session
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7000657.html
Copyright © 2020-2023  润新知