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的自学笔记
10.8-10.9马老师多线程笔记synchronized .md
此外,多线程编程也是Java的一大亮点,笔记会介绍线程的创建与同步机制,如synchronized关键字和wait/notify机制。 文件I/O操作是任何编程语言都不可或缺的部分,Java也不例外。笔记会讲解如何在Java中读写文件,...
学习者将了解到线程的基本概念、同步机制(如synchronized关键字、volatile变量、Lock接口)以及并发工具类,如ExecutorService和Semaphore。 对于Java SE中的高级特性,例如反射、注解、动态代理等,笔记可能也会...
笔记将介绍线程的创建方式、同步机制(如synchronized关键字、wait/notify、Lock接口)、线程池的使用等。 6. **网络编程**:Java提供Socket编程接口,可用于实现客户端/服务器模型的网络通信。笔记会讲解TCP和UDP...
初学者会学习如何创建和管理线程,理解线程同步和互斥的概念,以及如何使用synchronized关键字和wait()、notify()方法。 最后,笔记可能还会涵盖集合框架,包括ArrayList、LinkedList、HashMap等常用容器,以及泛型...
4. 多线程:在10多线程.md中,介绍了如何创建和管理Java线程,包括Thread类、Runnable接口,以及同步机制如synchronized关键字、wait()、notify()和notifyAll()方法。多线程技术是实现并发执行的关键,有助于提高...
10. **多线程**:Java提供了丰富的API支持并发编程,如Thread、Runnable接口,以及synchronized关键字,笔记可能涉及到线程的创建、同步和通信。 11. **枚举与注解**:枚举是Java中的特殊数据类型,而注解则是一种...
6. **多线程**:阐述Java中的并发编程,包括线程的创建、同步机制(synchronized、wait/notify、Lock接口)、线程池以及并发集合。 7. **设计模式**:介绍常见的设计模式,如单例、工厂、装饰器、观察者等,帮助...
11. **多线程**:线程的创建方式(实现Runnable接口和继承Thread类),线程同步机制(synchronized关键字、wait/notify机制)。 12. **文件与目录操作**:创建、删除、读写文件,以及目录的管理。 13. **枚举与...
Java并发编程中的Synchronized关键字是Java提供的一种内置锁机制,用于解决多线程环境下的线程安全问题。在Java中,线程安全意味着多个线程访问同一份资源时,能够保持数据的一致性和完整性,避免数据冲突。...
6. **多线程**:Java支持并发编程,笔记可能涉及Thread类、Runnable接口、同步机制(synchronized关键字、wait()、notify()方法)等内容。 7. **泛型**:Java泛型提供了类型安全的容器,笔记可能讨论了泛型类、泛型...
7. **多线程**:Java内置的Thread类,Runnable接口,同步机制(synchronized关键字,wait(), notify()方法),以及线程池的使用。 8. **反射**:动态获取类信息,实例化对象,调用方法,修改字段值等功能,是Java...
Java并发编程中的Synchronized是Java实现线程同步的关键机制,其在JDK1.6之后进行了大量的优化,包括引入了轻量级锁和偏向锁,以提升并发性能。以下是关于这些优化的详细解释: **一、重量级锁** 重量级锁是基于...
在并发编程部分,笔记会介绍线程的创建和管理,同步机制如synchronized关键字和Lock接口,以及并发工具类如ExecutorService、Semaphore和CountDownLatch。了解这些内容能帮助你在多核环境下编写高效的程序。 对于...
学习Thread类和Runnable接口,以及synchronized关键字、wait()、notify()和notifyAll()方法的使用。 7. **网络编程**:Java的Socket编程允许创建客户端和服务器应用程序,理解TCP和UDP协议,以及ServerSocket和...
Java在并发处理方面表现出色,笔记会讲解线程的创建与管理,包括Thread类和Runnable接口的使用,线程同步机制(synchronized、wait()、notify()、Lock接口等),以及线程池的使用和优化。 【IO与NIO】 在输入输出...
在并发编程领域,笔记将讨论线程的创建与同步,包括线程池、锁机制(synchronized、ReentrantLock等)、并发工具类(如Semaphore、CountDownLatch)以及并发容器(如ConcurrentHashMap)。这些内容在多线程环境下...
6. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口,以及同步控制方法如synchronized关键字、wait()、notify()等。学习笔记会介绍如何创建和管理线程,以及如何避免并发问题。 7. **网络编程...