synchronized 详解

问题

那到底使用synchronized关键字是不是就是一个监视器? 不懂,理解的话可以向我发邮件gaomengjie_1@163.com,我虚心求教

前言

之前介绍如何使用Lock和Condation 详情请查看传送门 介绍一下锁和条件的关键之处

  • 锁用来保护代码片段,任何时间只有一个线程执行被保护的代码
  • 锁可以管理试图进入被保护代码段的线程
  • 锁可以拥有一个或多个相关对象
  • 每个条件对象管理已经进入代码保护片段,但不能运行的线程

synchronized(内嵌到Java语言内部的简单锁)

  public synchronized void method(){
      ......
  }

// 等价于

public void method(){
  this.initLock.lock();
  try{
    // method 
  }finaly{
    this.initLock.unlock();
  }
}

synchronized 方法中使用wait方法是添加一个线程到等待集中,notifyAll /notify 方法解除等待线程的阻塞状态 将静态方法声明为synchronized也是合法的,这样会获得相关类对象的内部锁。如果Bank类有一个静态的同步方法,当该方法被调用时,Bank.class对象会被锁住,没有任何其他的线程可以调用同一个类的静态方法

内部锁和条件的一些局限性

  • 不能中断一个试图获得锁的线程
  • 试图获得锁时不能设置为超时
  • 每个锁仅有一个单一的条件可能是不够的
  • 最好既不使用 Lock/Condition 也不使用 synchronized 关键字
  • 如果 synchronized 关键字适合你的程序, 那么请尽量使用它, 这样可以减少编写的代 码数量, 减少出错的几率。
  • 如果特别需要 Lock/Condition 结构提供的独有特性时, 才使用 Lock/Condition。

synchronized关键字加锁

同步阻塞

每个对象含有锁,线程可以通过调用同步方法获得锁。还有 另一种机制可以获得锁, 通过进入一个同步阻塞。 也就是如下形式的阻塞:

  // 获得object的锁 
  synchronized (obj) // this is the syntax for a synchronized block
  {
      // do some work
  } 

我们也可以在转账操作中这样使用

public class Bank{
  private Object lock = new Object();
  public void transfer(int from ,int to ,int amount){
      synchronized (lock) // an ad-hoc lock
      {
          accounts[from] -= amount; 
          accounts[to] += amount;
      }
  }
}

监视器

监视器可以在不需要加锁的情况下保持线程的安全性

  • 监视器是只包含私有域的类
  • 每个监视器对象有一个私有的锁
  • 使用该锁对所有的方法都进行加锁
  • 该锁可以有任意多个相关条件

Volatile 域

volatile 关键字为实例域的同步访问提供了一种免锁机制。通知编译器和处理器此处可能并发更新,但Volatile操作并不是原子性的。保证安全读取

final变量 也可以安全的访问一个共享域

今天就到这吧,看不下去了这一章节!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老马说编程

(65) 线程的基本概念 / 计算机程序的思维逻辑

在之前的章节中,我们都是假设程序中只有一条执行流,程序从main方法的第一条语句逐条执行直到结束。从本节开始,我们讨论并发,在程序中创建线程来启动多条执行流,并...

2197
来自专栏noteless

-1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),

java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法...

1064
来自专栏海天一树

小朋友学Java(12):包

包(package)是Java语言提供的一种区别类名字命名空间的机制,它是类的一种文件组织和管理方式、是一组功能相似或相关的类或接口的集合。Java packa...

2856
来自专栏PHP实战技术

你真的了解如何将 Nginx 配置为Web服务器吗

阅读之前,建议先阅读初识 Nginx。 之后,我们来了解一下 Nginx 配置。

2458
来自专栏后端技术探索

vim 乱码问题解决及原理全面分析

Vim有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding(这些选项设置请...

1321
来自专栏haifeiWu与他朋友们的专栏

Redis协议规范(译文)

Redis客户端使用名为RESP(Redis序列化协议)的协议与Redis服务器进行通信。 虽然该协议是专为Redis设计的,但它可以用于其他CS软件项目的通讯...

1313
来自专栏大内老A

.NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象

配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置。值得推荐的做法就是采用《.NET Cor...

18810
来自专栏IT笔记

Linux下安装Redis3

下载 下载地址 http://redis.io/download Linux 下执行 wget http://download.redis.io/relea...

3495
来自专栏GreenLeaves

JS模块加载系统设计V1

一、require模块 +function() { var path = location.protocol + "//" + loca...

1985
来自专栏java 成神之路

JVM 类加载机制深入浅出

26511

扫码关注云+社区