synchronized 锁重入
关键字synchronized锁重入的功能,也就是在使用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 sDubbo1 = new SyncDubbo1(); Thread t1 = new Thread(new Runnable() { @Override public void run() { sDubbo1.method1(); } }); t1.start(); } }
父子类继承关系时
public class SyncDubbo2 { static class Main{ public int i = 10; public synchronized void operatorSup(){ try { i--; System.out.println("Main print i = "+i); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } } static class Sub extends Main{ public synchronized void operatorSub(){ try { while (i>0) { i--; System.out.println("Sub print i = "+i); Thread.sleep(100); this.operatorSup(); } } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { Sub sub = new Sub(); sub.operatorSub(); } }); t1.start(); } }
对象锁 使用示例
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() { @Override public void run() { objLock.method1(); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { objLock.method2(); } }); Thread t3 = new Thread(new Runnable() { @Override public void run() { objLock.method3(); } }); t1.start(); t2.start(); t3.start(); } }
尽量避免使用 字符串对象 做为锁对象
相关推荐
java同步synchronized关键字用法示例
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
synchronized关键字在java中的重要性 以及常用的方法 还有它的详解
Synchronized关键字的用法
线程安全,使用synchronized关键字
Lock接口与synchronized关键字在Java并发编程中都是用于实现同步机制的重要工具,但它们在使用方式、功能特性以及灵活性等方面存在一些显著的差异。 首先,从使用方式上来看,synchronized是Java语言内置的关键字,...
java基本教程之synchronized关键字java多线程教程共19页.pdf.zip
并发编程原理学习:synchronized关键字.doc
java的线程同步机制synchronized关键字的理解_.docx
java synchronized关键字原理、自定义一把锁来实现同步等
【Java并发编程】Synchronized关键字实现原理.doc
Java多线程synchronized关键字详解(六)共5页.pdf.zip
5-4JVM内置锁synchronized关键字详解.mp4
实例解析Java中的synchronized关键字与线程平安问题_.docx
主要介绍了Java中synchronized关键字的用法,针对synchronized修饰方法的使用作出了简单讲解和演示,需要的朋友可以参考下
【ASP.NET编程知识】实例解析Java中的synchronized关键字与线程安全问题.docx
NULL 博文链接:https://seandsky-boyy-163-com.iteye.com/blog/1340783
Java并发编程---synchronized关键
主要介绍了Java synchronized关键字使用方式及特性解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下