synchronized的4种用法
1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.例如:public synchronized void synMethod() {//方法体}2.对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.例如:public int synMethod(int a1){synchronized(a1) {//一次只能有一个线程进入}}3.synchronized后面括号里是一对象,此时,线程获得的是对象锁.例如:public class MyThread implements Runnable {public static void main(String args[]) {MyThread mt = new MyThread();Thread t1 = new Thread(mt, "t1");Thread t2 = new Thread(mt, "t2");Thread t3 = new Thread(mt, "t3");Thread t4 = new Thread(mt, "t4");Thread t5 = new Thread(mt, "t5");Thread t6 = new Thread(mt, "t6");t1.start();t2.start();t3.start();t4.start();t5.start();t6.start();}public void run() {synchronized (this) {System.out.println(Thread.currentThread().getName());}}}对于3,如果线程进入,则得到对象锁,那么别的线程在该类所有对象上的任何操作都不能进行.在对象级使用锁通常是一种比较粗糙的方法。为什么要将整个对象都上锁,而不允许其他线程短暂地使用对象中其他同步方法来访问共享资源?如果一个对象拥有多个资源,就不需要只为了让一个线程使用其中一部分资源,就将所有线程都锁在外面。由于每个对象都有锁,可以如下所示使用虚拟对象来上锁:class FineGrainLock {MyMemberClass x, y;Object xlock = new Object(), ylock = new Object();public void foo() {synchronized(xlock) {//access x here}//do something here - but don't use shared resourcessynchronized(ylock) {//access y here}}public void bar() {synchronized(this) {//access both x and y here}//do something here - but don't use shared resources}}4.synchronized后面括号里是类.例如:class ArrayWithLockOrder{private static long num_locks = 0;private long lock_order;private int[] arr;public ArrayWithLockOrder(int[] a){arr = a;synchronized(ArrayWithLockOrder.class) {//-----------------------------------------这里num_locks++;             // 锁数加 1。lock_order = num_locks;  // 为此对象实例设置唯一的 lock_order。}}public long lockOrder(){return lock_order;}public int[] array(){return arr;}}class SomeClass implements Runnable{public int sumArrays(ArrayWithLockOrder a1,ArrayWithLockOrder a2){int value = 0;ArrayWithLockOrder first = a1;       // 保留数组引用的一个ArrayWithLockOrder last = a2;        // 本地副本。int size = a1.array().length;if (size == a2.array().length){if (a1.lockOrder() > a2.lockOrder())  // 确定并设置对象的锁定{                                     // 顺序。first = a2;last = a1;}synchronized(first) {              // 按正确的顺序锁定对象。synchronized(last) {int[] arr1 = a1.array();int[] arr2 = a2.array();for (int i=0; i<size; i++)value += arr1[i] + arr2[i];}}}return value;}public void run() {//...}}对于4,如果线程进入,则线程在该类中所有操作不能进行,包括静态变量和静态方法,实际上,对于含有静态方法和静态变量的代码块的同步,我们通常用4来加锁.以上4种之间的关系:锁是和对象相关联的,每个对象有一把锁,为了执行synchronized语句,线程必须能够获得synchronized语句中表达式指定的对象的锁,一个对象只有一把锁,被一个线程获得之后它就不再拥有这把锁,线程在执行完synchronized语句后,将获得锁交还给对象。在方法前面加上synchronized修饰符即可以将一个方法声明为同步化方法。同步化方法在执行之前获得一个锁。如果这是一个类方法,那么获得的锁是和声明方法的类相关的Class类对象的锁。如果这是一个实例方法,那么此锁是this对象的锁。

  

转载于:https://www.cnblogs.com/zuolun2017/p/7808682.html

synchronized的4种用法相关推荐

  1. 面试常考:Synchronized 有几种用法?

    我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面.其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法. 1.同步普通方法 这个也是我 ...

  2. synchronized的四种用法

    https://www.cnblogs.com/lukelook/p/9946065.html

  3. 【Java】Synchronized解析以及多种用法

    1.概述 [Java]Synchronized 有几种用法 [java] 从hotspot底层对象结构理解锁膨胀升级过程 [java]动态高并发时为什么推荐重入锁而不是Synchronized? [j ...

  4. Synchronized三种用法

    首先我们了解到Java中的线程同步锁可以是任意对象. 这里我们介绍synchronized的三种应用方式: 1.作用于实例方法,当前实例加锁,进入同步代码前要获得当前实例的锁: 2.作用于静态方法,当 ...

  5. Synchronized的两个用法

    Synchronized的作用: 能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果 Synchronized的两个用法: 1)对象锁 包括方法锁(默认锁对象为this当前实例对 ...

  6. Android Intent的几种用法全面总结

    Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...

  7. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示.  比如 SELECT * FROM [user ...

  8. javamap的用法_Java Map常用的几种用法。

    Java Map常用的几种用法. 通常,Map是由一组键值对组成的数据结构,每个键只能在映射中出现一次.这篇文章总结了有关如何使用Java Map及其实现的类的前9个常见问题解答.为了简单起见,我将在 ...

  9. 详解synchronized锁的各种用法及注意事项

    1 前言 本文主要通过简单的demo来阐述synchronized锁的各种用法以及使用synchronized锁的相关注意事项,记录下来同时也方便自己记忆. synchronized锁是jvm内置的锁 ...

最新文章

  1. 用IKVMC将jar转成dll供c#调用
  2. 深度linux安装spotify,如何在 Linux 上使用 snap 安装 Spotify(声破天)
  3. 【揭秘】Slack:从0到10亿美元的产品是怎样炼成的
  4. 直播 | 小爱通用理解团队负责人雷宗:小爱同学中控意图理解
  5. Jenkins学习七:Jenkins的授权和访问控制
  6. caja 原理 : 前端
  7. MySQL INFORMATION_SCHEMA 使用
  8. mysql5.715 安装在d盘_mysql5.7.15在windows环境下的安装设置图文详细教程
  9. 并发 - 生产者消费者的问题
  10. python文件命名的错误
  11. 令牌桶算法和漏桶算法python_图解Python算法
  12. c 语言比较三个整数大小,C 语言 —— 比较三个整数的大小并从大到小输出
  13. DOTNET零碎要点---vb.net获取combox的选中值,删除Datagridview,选中值,处理提示框...
  14. 渐进记号的相关证明(使用极限的方式)
  15. serviceFabric oracle,Oracle ASM和多路径软件的兼容性【转】
  16. linux下qt网络编程 qnetworkreply,QT网络编程之文件下载 QNetworkRequest QNetworkReply QNetworkAccessManager...
  17. 软件开发 项目进展 软件架构 指南
  18. Beego 使用redigo连接redis
  19. 【Rust日报】2022-07-06 Android 平台中的 Rust
  20. ESP8266-Arduino编程实例-BMM150数字地磁传感器驱动

热门文章

  1. glxinfo: not found
  2. Ubuntu更换国内源(apt更换源)
  3. 边界信任模型,零信任模型
  4. yum提示Another app is currently holding the yum lock; waiting for it to exit...
  5. ARP欺骗原理详细介绍
  6. python try语句相关(try/except/else/finally)
  7. centos下 Tcpreplay 重放数据(流量采集重放)
  8. 【sql:练习题3】查询在 SC 表存在成绩的学生信息
  9. Oracle_高级功能(3) synonym和database link
  10. dbms_stats包更新、导出、导入、锁定统计信息