锁重入:

/*** synchronized的重入*/
public class SyncDubbo1 {public synchronized void method1(){System.out.println("method1..");method2();}public synchronized void method2(){System.out.println("method2..");method3();}public synchronized void method3(){System.out.println("method3..");}public static void main(String[] args) {final SyncDubbo1 sd = new SyncDubbo1();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {sd.method1();}});t1.start();}
}
/*** synchronized异常*/
public class SyncException {private int i = 0;public synchronized void operation(){while(true){try {i++;Thread.sleep(100);System.out.println(Thread.currentThread().getName() + " , i = " + i);if(i == 10){Integer.parseInt("a");//throw new RuntimeException();}} catch (Exception e) {e.printStackTrace();System.out.println(" log info i = " + i);}}}public static void main(String[] args) {final SyncException se = new SyncException();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {se.operation();}},"t1");t1.start();}}
/*** synchronized异常*/
public class SyncException {private int i = 0;public synchronized void operation(){while(true){try {i++;Thread.sleep(100);System.out.println(Thread.currentThread().getName() + " , i = " + i);if(i == 10){Integer.parseInt("a");//throw new RuntimeException();}} catch (InterruptedException e) {e.printStackTrace();System.out.println(" log info i = " + i);throw new RuntimeException();//continue;}}}public static void main(String[] args) {final SyncException se = new SyncException();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {se.operation();}},"t1");t1.start();}}
/*** 使用synchronized代码块加锁,比较灵活*/
public class ObjectLock {public void method1(){synchronized (this) {    //对象锁try {System.out.println("do method1..");Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}public void method2(){       //类锁synchronized (ObjectLock.class) {try {System.out.println("do method2..");Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}private Object lock = new Object();public void method3(){       //任何对象锁synchronized (lock) {try {System.out.println("do method3..");Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {final ObjectLock objLock = new ObjectLock();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {objLock.method1();}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {objLock.method2();}});Thread t3 = new Thread(new Runnable() {@Overridepublic void run() {objLock.method3();}});t1.start();t2.start();t3.start();}}
/*** synchronized代码块对字符串的锁,注意String常量池的缓存功能*/
public class StringLock {public void method() {//new String("字符串常量")synchronized (new String("字符串常量")) {try {while(true){System.out.println("当前线程 : "  + Thread.currentThread().getName() + "开始");Thread.sleep(1000);     System.out.println("当前线程 : "  + Thread.currentThread().getName() + "结束");}} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {final StringLock stringLock = new StringLock();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {stringLock.method();}},"t1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {stringLock.method();}},"t2");t1.start();t2.start();}
}
/*** 锁对象的改变问题*/
public class ChangeLock {private String lock = "lock";private void method(){synchronized (lock) {try {System.out.println("当前线程 : "  + Thread.currentThread().getName() + "开始");lock = "change lock";Thread.sleep(2000);System.out.println("当前线程 : "  + Thread.currentThread().getName() + "结束");} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {final ChangeLock changeLock = new ChangeLock();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {changeLock.method();}},"t1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {changeLock.method();}},"t2");t1.start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}t2.start();}}
/*** 同一对象属性的修改不会影响锁的情况*/
public class ModifyLock {private String name ;private int age ;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public synchronized void changeAttributte(String name, int age) {try {System.out.println("当前线程 : "  + Thread.currentThread().getName() + " 开始");this.setName(name);this.setAge(age);System.out.println("当前线程 : "  + Thread.currentThread().getName() + " 修改对象内容为: " + this.getName() + ", " + this.getAge());Thread.sleep(2000);System.out.println("当前线程 : "  + Thread.currentThread().getName() + " 结束");} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {final ModifyLock modifyLock = new ModifyLock();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {modifyLock.changeAttributte("张三", 20);}},"t1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {modifyLock.changeAttributte("李四", 21);}},"t2");t1.start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}t2.start();}}

synchronized细节问题相关推荐

  1. oracle全局批准供应商,Oracle EBS-SQL (PO-7):检查异常-非批准的供应商设置供货比例.sql...

    select distinct msr.sourcing_rule_name            名称 ,msi.description                          说明 ,m ...

  2. Java并发之从基础到框架

    一  线程基础 1.synchronized取得的锁都是对象锁,哪个线程执行synchronized修饰的方法,哪个线程就获得这个方法所属对象的锁.不同对象不同锁,互不影响. 另一种情况是static ...

  3. Java synchronized的CPU层面实现细节

    sync的CPU层面实现细节:

  4. java中JAO_JVM内部细节之一:synchronized关键字及实现细节(轻量级锁Lightweight Locking)...

    在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作.然而在Java中除了提供Lock API外还在语法层面上提供了synchronized关键字来实现互斥同步 ...

  5. JDK synchronized的实现细节

    ①字节码层面:会加入monitorenter指令和两条monitorexit指令,为什么有两条exit,因为如果产生异常会自动退出. ②JVM层面:由C,C++调用了操作系统提供的同步机制. ③OS和 ...

  6. servlet必知细节(一)

    servlet必知细节(一) 今天复习了一下servlet,有过一些编程经验后,与最初学习servlet相比,对servlet理解的角度不同了,最初只是学习了如何写一个servlet,api怎么用,现 ...

  7. 高并发下秒杀商品,你必须知道的9个细节

    前言 高并发下如何设计秒杀系统?这是一个高频面试题.这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个 ...

  8. 打工人,从 JMM 透析 volatile 与 synchronized 原理

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 在面试.并发编程.一些开源框架中总是会遇到 volatil ...

  9. 死磕Synchronized底层实现

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:http://suo.im/6h5g96 关于syn ...

最新文章

  1. swift 方法的局部和外部参数名
  2. Jmeter(二)关联
  3. qt禁止拖动_[Qt]QMdiArea,无框架窗口的拖动
  4. java机房收费管理系统课程设计_(c语言)机房收费管理系统课程设计
  5. TrueCrypt中文版怎么用?TrueCrypt使用方法及详细教程介绍
  6. lubuntu输入法设置_Ubuntu18输入法设置
  7. AutoPatch java_Android热更新九:Robust热更新原理
  8. bluetooth 驱动 Makefile
  9. iis中应用程序服务器错误,iis应用程序服务器错误
  10. 如何规划局域网IP地址
  11. 欧几里德 与 扩展欧几里得 学习笔记
  12. 智链ChainNova携手IBM推出端到端区块链解决方案
  13. 简单叙述python的编程规范_简明 Python 编程规范
  14. 基于深度学习的无人驾驶道路检测
  15. 深入原生冰山安全体系,详解华为云安全服务如何构筑全栈安全
  16. VLAN Aggregation(VLAN 聚合,也称Super VLAN)
  17. 群辉docker安装树莓派镜像_群辉docker安装树莓派镜像_如何在树莓派安装Docker
  18. 记录使用nginx部署静态资源流程,以及遇到的访问静态资源404问题
  19. 快手智能处理与编码算法产品化之路
  20. php 混合开发框架,Spiral: 性能卓越的PHP/Golang混合开发框架

热门文章

  1. linux 应用层时间和随机数,zigbee cc2530时间
  2. 自定义类型处理器的应用
  3. yslow客户端性能测试
  4. Django 之 Cookie判断是否已登陆(写成类)
  5. Netty框架整体架构及源码知识点
  6. Netflix如何使用机器学习来提升流媒体质量?
  7. MySQL + Atlas 部署读写分离
  8. OpenStack Fernet Key Rotate
  9. 铁钉的blog地址 http://nails.blog.51cto.com
  10. 关于 Qt 5,你所需要了解的基础知识