`
lighter
  • 浏览: 500228 次
  • 性别: 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的自学笔记

    10.8-10.9马老师多线程笔记synchronized .md

    10.8-10.9马老师多线程笔记synchronized .md

    java超强笔记

    此外,多线程编程也是Java的一大亮点,笔记会介绍线程的创建与同步机制,如synchronized关键字和wait/notify机制。 文件I/O操作是任何编程语言都不可或缺的部分,Java也不例外。笔记会讲解如何在Java中读写文件,...

    达内Java_笔记整理.rar_Java 达内笔记_Java笔记_java 笔记_笔记_达内

    学习者将了解到线程的基本概念、同步机制(如synchronized关键字、volatile变量、Lock接口)以及并发工具类,如ExecutorService和Semaphore。 对于Java SE中的高级特性,例如反射、注解、动态代理等,笔记可能也会...

    李兴华java笔记

    笔记将介绍线程的创建方式、同步机制(如synchronized关键字、wait/notify、Lock接口)、线程池的使用等。 6. **网络编程**:Java提供Socket编程接口,可用于实现客户端/服务器模型的网络通信。笔记会讲解TCP和UDP...

    非常好的java笔记适合初学者

    初学者会学习如何创建和管理线程,理解线程同步和互斥的概念,以及如何使用synchronized关键字和wait()、notify()方法。 最后,笔记可能还会涵盖集合框架,包括ArrayList、LinkedList、HashMap等常用容器,以及泛型...

    Java基础 学习笔记 Markdownr版

    4. 多线程:在10多线程.md中,介绍了如何创建和管理Java线程,包括Thread类、Runnable接口,以及同步机制如synchronized关键字、wait()、notify()和notifyAll()方法。多线程技术是实现并发执行的关键,有助于提高...

    java基础的详细案例笔记

    10. **多线程**:Java提供了丰富的API支持并发编程,如Thread、Runnable接口,以及synchronized关键字,笔记可能涉及到线程的创建、同步和通信。 11. **枚举与注解**:枚举是Java中的特殊数据类型,而注解则是一种...

    java学习笔记markdown

    6. **多线程**:阐述Java中的并发编程,包括线程的创建、同步机制(synchronized、wait/notify、Lock接口)、线程池以及并发集合。 7. **设计模式**:介绍常见的设计模式,如单例、工厂、装饰器、观察者等,帮助...

    狂神说笔记内容.zip

    11. **多线程**:线程的创建方式(实现Runnable接口和继承Thread类),线程同步机制(synchronized关键字、wait/notify机制)。 12. **文件与目录操作**:创建、删除、读写文件,以及目录的管理。 13. **枚举与...

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

    Java并发编程中的Synchronized关键字是Java提供的一种内置锁机制,用于解决多线程环境下的线程安全问题。在Java中,线程安全意味着多个线程访问同一份资源时,能够保持数据的一致性和完整性,避免数据冲突。...

    李兴华核心技术笔记 mldn

    6. **多线程**:Java支持并发编程,笔记可能涉及Thread类、Runnable接口、同步机制(synchronized关键字、wait()、notify()方法)等内容。 7. **泛型**:Java泛型提供了类型安全的容器,笔记可能讨论了泛型类、泛型...

    非常详细javaSE学习笔记.rar

    7. **多线程**:Java内置的Thread类,Runnable接口,同步机制(synchronized关键字,wait(), notify()方法),以及线程池的使用。 8. **反射**:动态获取类信息,实例化对象,调用方法,修改字段值等功能,是Java...

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

    Java并发编程中的Synchronized是Java实现线程同步的关键机制,其在JDK1.6之后进行了大量的优化,包括引入了轻量级锁和偏向锁,以提升并发性能。以下是关于这些优化的详细解释: **一、重量级锁** 重量级锁是基于...

    宋红康java笔记.rar

    学习Thread类和Runnable接口,以及synchronized关键字、wait()、notify()和notifyAll()方法的使用。 7. **网络编程**:Java的Socket编程允许创建客户端和服务器应用程序,理解TCP和UDP协议,以及ServerSocket和...

    韩顺平java从入门到精通笔记完整版

    在并发编程部分,笔记会介绍线程的创建和管理,同步机制如synchronized关键字和Lock接口,以及并发工具类如ExecutorService、Semaphore和CountDownLatch。了解这些内容能帮助你在多核环境下编写高效的程序。 对于...

    李兴华java word版全部笔记

    Java在并发处理方面表现出色,笔记会讲解线程的创建与管理,包括Thread类和Runnable接口的使用,线程同步机制(synchronized、wait()、notify()、Lock接口等),以及线程池的使用和优化。 【IO与NIO】 在输入输出...

    李兴华2016年java课堂笔记

    在并发编程领域,笔记将讨论线程的创建与同步,包括线程池、锁机制(synchronized、ReentrantLock等)、并发工具类(如Semaphore、CountDownLatch)以及并发容器(如ConcurrentHashMap)。这些内容在多线程环境下...

    Java学习笔记(源码)

    6. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口,以及同步控制方法如synchronized关键字、wait()、notify()等。学习笔记会介绍如何创建和管理线程,以及如何避免并发问题。 7. **网络编程...

Global site tag (gtag.js) - Google Analytics