1.synchronized方法相当于synchronized(this)
     Synchronized 方法是锁的当前对象,同一个对象的2个synchronized方法被2个线程调用会发生阻塞;
2.static synchronized方法相当于synchronized(this.class)
  static synchronized方法是锁当前对象的Class,被所有此类的实例共享,多个线程调用此类的static synchronized方法会发生阻塞

package com.lly.base.syn;
/**
* synchronized阻塞测试
* 1.synchronized方法相当于synchronized(this)
* Synchronized 方法是锁的当前对象,同一个对象的2个synchronized方法被2个线程调用会发生阻塞;
* 2.static synchronized方法相当于synchronized(this.class) 
* static synchronized方法是锁当前对象的Class,被所有此类的实例共享,多个线程调用此类的static synchronized方法会发生阻塞
*
* @author liuly
*
*/
public class SynchronizedTest { public static void main(String[] args) {
Syn1 n1 = new Syn1();
Syn1 n2 = new Syn1();
//
// /******两个线程会阻塞 (对象锁)**/
// new Thread(()->{
// System.out.println("线程1 启动");
// n1.add1();
//
// }).start();
//
// new Thread(()->{
// System.out.println("线程2 启动");
// n1.add1();
//
// }).start();
//
// /******两个线程会阻塞 (对象锁) add1 add2 锁定同一个对象n1**/
// new Thread(()->{
// System.out.println("线程1 启动");
// n1.add1();
//
// }).start();
//
// new Thread(()->{
// System.out.println("线程2 启动");
// n1.add2();
//
// }).start();
//
// /******两个线程不会阻塞(static add3是类锁,而add2 是对象锁 ) **/
// new Thread(()->{
// System.out.println("线程1 启动");
// n1.add2();
//
// }).start();
//
// new Thread(()->{
// System.out.println("线程2启动");
// n2.add3();
//
// }).start();
// /******两个线程不会阻塞(static add3是类锁,虽然不是一个对象,但都是锁定同一个Syn1.class ) **/
// new Thread(()->{
// System.out.println("线程1 启动");
// n1.add3();
//
// }).start();
//
// new Thread(()->{
// System.out.println("线程2 启动");
// n2.add3();
//
// }).start(); }
} class Syn1{
/*
* 非静态方法一:add1
* 同一个对象的add1方法会与add2阻塞
*/
public synchronized void add1(){
System.out.println("add1 begin");
try {
Thread.sleep(4000);
System.out.println("add1 end");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 非静态方法一:add2
*
*/
public synchronized void add2(){
System.out.println("add2 begin"); try {
Thread.sleep(1000);
System.out.println("add2 end");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 静态方法一:add3
* 所有的调用add3方法的线程都会阻塞
*
* 注:add3不会与add1(or add2)阻塞
*/
public static synchronized void add3(){
System.out.println("add3 begin"); try {
Thread.sleep(1000);
System.out.println("add3 end");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Synchronized 个人深解的更多相关文章

  1. Java多线程(三)—— synchronized关键字详解

    一.多线程的同步 1.为什么要引入同步机制 在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源.必须对这种潜在资源冲突进行预防. 解决方法:在线程使用一个资源时为其加锁即可. 访问资 ...

  2. “全栈2019”Java多线程第十六章:同步synchronized关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. Java synchronized 关键字详解

    Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 sync ...

  4. Java并发之Synchronized机制详解

    带着问题阅读 1.Synchronized如何使用,加锁的粒度分别是什么 2.Synchronized的实现机制是什么 3.Synchronized是公平锁吗 4.Java对Synchronized做 ...

  5. synchronized锁详解

    synchronized的意义 解决了Java共享内存模型带来的线程安全问题: 如:两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?(针对这个问题进行分析 ...

  6. (转)Lock和synchronized比较详解

    今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问题没有谈到,但这篇文章相当不 ...

  7. 从线程池到synchronized关键字详解

    线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...

  8. java synchronized 同步详解

    记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchron ...

  9. Java 多线程(六) synchronized关键字详解

    多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchroniz ...

随机推荐

  1. 使用linux命令行配置无线网链接

    1. 需安装wpa_supplicant https://wiki.archlinux.org/index.php/WPA_Supplicant_%28%E7%AE%80%E4%BD%93%E4%B8 ...

  2. ACM spiral grid

    spiral grid 时间限制:2000 ms  |  内存限制:65535 KB 难度:4   描述 Xiaod has recently discovered the grid named &q ...

  3. ACM: Happy 2004-数论专题-因子求和-快速幂

    Happy 2004 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descript ...

  4. [Leetcode] Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  5. Xcode的command+shift+o是一个不错的工具

    一,经历 1.在向UITextField中输入图片的时候,可以使用 NSAttributedString 添加,但是很难找到能够返回NSAttributedString对象的方法. 2.通过comma ...

  6. Hadoop、Zookeeper、Hbase分布式安装教程

    参考: Hadoop安装教程_伪分布式配置_CentOS6.4/Hadoop2.6.0   Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS ZooKeeper-3.3 ...

  7. 转MongoDB 使用Skip和limit分页

    关于MongoDB 数据分页和排序 limit,skip用户的一些基础语句,介绍MongoDB 数据分页和排序实例方法. 使用Skip和limit可以如下做数据分页: Code: page1 = db ...

  8. 基于 Node.js 平台,快速、开放、极简的 web 开发框架。

    资料地址:http://www.expressjs.com.cn/ Express 基于 Node.js 平台,快速.开放.极简的 web 开发框架. $ npm install express -- ...

  9. Linux 的cp命令

    Linux 的cp命令 功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若 ...

  10. wego微购RSS、Sitemap、Ping、腾讯拍拍网购采集插件

    和哥们研究淘宝客,找到微购这个程序觉得挺不错的,但是地图和RSS功能不是特别完善,于是小憩一下,做了下初级的拓展,分享给大家,开源精神嘛,大家也可以去我的网站我要购物平台去看看. 1.拓展后台seoA ...