`
lighter
  • 浏览: 495564 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

synchronized 笔记

阅读更多
synchronized 笔记

1、synchronized实例方法
synchronized void method(){
  ...
}


在功能上,它相当于
void method() {
     synchronized (this) {
	...
    }
}


2、synchronized类方法
class Something {
   static synchronized void method(){
     ...
   }
}


在功能上,它相当于
class Something {
    static void method() {
      synchronized (Something.class){
       ...
    }
  }
}


3、如果我们也可以自定义方法来实现相当于synchronized类似的功能,代码如下:

void method() {
    lock();
    try{
       ...
    }finally{
       unlock();
    }
}

以上的代码就是一个Before/After Pattern的一种实现方式
举例:
下面中Mutex类这种用来进行共享互斥的机制,一般称为mutex。
public class Gate {
    private int counter = 0;
    private String name = "Nobody";
    private String address = "Nowhere";
    private final Mutex mutex = new Mutex();
    public void pass(String name, String address) { // 并非synchronized
        mutex.lock();
        try {
            this.counter++;
            this.name = name;
            this.address = address;
            check();
        } finally {
            mutex.unlock();
        }
    }
    public String toString() { // 并非synchronized
        String s = null;
        mutex.lock();
        try {
            s = "No." + counter + ": " + name + ", " + address;
        } finally {
            mutex.unlock();
        }
        return s;
    }
    private void check() {
        if (name.charAt(0) != address.charAt(0)) {
            System.out.println("***** BROKEN ***** " + toString());
        }
    }
}


设计简单的Mutex类1:
public final class Mutex {
    private boolean busy = false;
    public synchronized void lock() {
        while (busy) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        busy = true;
    }
    public synchronized void unlock() {
        busy = false;
        notifyAll();
    }
}


设计完善的Mutex类2:
public final class Mutex {
    private long locks = 0;
    private Thread owner = null;
    public synchronized void lock() {
        Thread me = Thread.currentThread();
        while (locks > 0 && owner != me) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        // locks == 0 || owner == me
        owner = me;
        locks++;
    }
    public synchronized void unlock() {
        Thread me = Thread.currentThread();
        if (locks == 0 || owner != me) {
            return;
        }
        // locks > 0 && owner == me
        locks--;
        if (locks == 0) {
            owner = null;
            notifyAll();
        }
    }
}



4、我们看到synchronized块的时候,要先思考"synchronized是在保护什么",然后进一步思考"获取谁的锁定来保护的呢"
   要调用synchronized实例方法的纯种,一定会获取thid的锁定。一个实例的锁定,同一个时间内,只能有个线程可以得到。
   如果实例不同,那锁定也不同了。使用synchronized块的时候,特别需要考虑"获取谁的锁定来保护的呢"这种情况。因为
   synchronized需要明确地指明要获取的是哪个对象的锁定。例如:
 
 synchronized (obj) {
     ...
   }

  这样的程序代码中,obj就是我们所要获取锁定的对象。请小心这个对象不可心写错,获取错误对象的锁定,就好想要保护自己
  自己的家,却把别人家的门给锁定了。


注:代码来自 Java多线程设计模式 第一章SingleThreadedExecution方面的内容





分享到:
评论

相关推荐

    synchronized深度解析-课堂笔记

    该内容是在暮课网学习的课程比较,讲解synchronized的原理和用法,以及常见的面试题。上传网上以供自己以后复习。

    synchronized.md

    关于synchronized的自学笔记

    Java 并发编程学习笔记之Synchronized底层优化

    主要介绍了Java 并发编程学习笔记之Synchronized底层优化的相关资料,主要包含了重量级锁,轻量级锁,偏向锁和其他优化等方面,有需要的小伙伴可以参考下

    Java并发编程学习笔记

    1、线程安全和锁 Synchronized 底层实现原理 2、可重入锁与 Synchronized 的其他特性 3、ThreadLocal 的底层实现与使用 4、ReentrantLock底层实现和如何使用 5、Condition源码分析 6、ReentrantReadWriteLock底层...

    Java 并发编程学习笔记之Synchronized简介

    虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了...

    多线程与高并发编程笔记、源码等

    超全的多线程与高并发的编程笔记,从JVM&JMM角度讲多线程,synchronized优化原理,AQS和线程池等等,需要的童鞋请自行下载!

    Java并发学习笔记(二)——Synchronized关键字与ReetrantLock同步锁

    一、Synchronized 1、概念 synchronized保证被修饰的方法或代码块操作的原子性、可见性和有序性。synchronized可重入锁、不可中断,适合线程竞争不激烈。 被Synchronized 关键字描述的方法或代码块在多线程环境下...

    java多线程笔记

    四、 使用synchronized关键字要注意以下四点 39 五、 关于同步和锁定的一些问题 41 Java线程:并发协作-线程的交互 47 Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的...

    LengendOfDong#Blog#原创-并发编程学习笔记(三)------synchronized的实现原理及应用1

    1.偏向锁 2.轻量级锁 3.锁的优缺点对比

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    11.1.5 synchronized与volatile 334 11.1.6 等待与通知 345 11.2 并行api 349 11.2.1 lock、readwritelock与condition 349 11.2.2 使用executor 357 11.2.3 并行collection简介 370 11.3 重点复习 373 ...

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    java线程学习笔记

    2.1 解决共享资源(synchronized、lock) 12 2.1.1 描述synchronized 12 2.1.2 synchronized 关键字 12 2.1.3 lock 13 2.2 原子性与易变性(volatile) 13 2.2.1 Volatile 13 2.2.2 原子类(AtomicInteger,...

    net学习笔记及其他代码应用

    1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。...47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可...

    笔记-4、显式锁和AQS1

    4、显式锁和AQS 显式锁Lock接口和核心方法Lock接口和synchronized的比较synchronized 代码简洁,Lock:获取锁可以被中断,超时

    Java多线程源码笔记.pdf

    1.什么是多线程 2.Thread类解析 3.使用多线程需要注意的问题 4.synchronized锁和lock锁 5.AQS 6.ReentrantLock和ReentrantReadWriteLock 7.线程池 8.死锁 9.线程常用的工具栏 10.Atomic 11.ThreadLocal

    JUC多线程学习个人笔记

    原子操作:JUC提供了一些原子操作类,如AtomicInteger、AtomicLong等,可以实现线程安全的原子操作,避免了使用synchronized关键字的性能损耗。 锁机制:JUC提供了Lock接口和Condition接口,可以实现更细粒度的锁...

    Java并发编程笔记之ConcurrentHashMap原理探究.docx

    HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下。ConcurrentHashMap可以做到读取数据不...

    笔记本

    笔记本 Скриншоты ...Дальнейшаясинхронизацияссерверомреализованаспомощью软删除(“ isSynchronized”和“ deleted_at”实体)。 Такжереа

    java8源码-JavaRobot:Java学习笔记,JavaLearningNote

    学习笔记(持续更新中) 所有文章均同步发布到微信公众号【JavaRobot】,关注微信公众号,及时得到文章推送,谢谢支持。 说明:如无特别说明,所有代码都基于JDK8 JavaSE(Java基础) Java Core 关键字 synchronized...

    notes-learning-java-concurrency:java 并发学习笔记

    Java并发编程学习笔记 这是我两年前(2012-05)的学习笔记。。 -- 本文不会详细介绍java5以前的多线程开发...协调共享对象访问,在java5以前用synchronized实现,现在可以用Lock显式的lock()和unlock(),并且有定时锁,读写

Global site tag (gtag.js) - Google Analytics