博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 学习笔记之 Synchronized锁对象
阅读量:7040 次
发布时间:2019-06-28

本文共 3927 字,大约阅读时间需要 13 分钟。

Synchronized锁对象:

 

Synchronized取得的锁都是对象锁,而不是把一段代码或方法当作锁,哪个线程执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,那么其他线程只能等待,前提是多个线程访问的是同一个对象。

实验得出以下结论:

  • A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法。
public class Sync1Object {    synchronized public void methodA() {        try {            System.out.println("begin methodA threadName = "                    + Thread.currentThread().getName());            Thread.sleep(5000);            System.out.println("A end endTime = " + System.currentTimeMillis());        } catch (InterruptedException e) {            e.printStackTrace();        }    }     public void methodB() {        try {            System.out.println("begin methodB threadName = "                    + Thread.currentThread().getName() + " begin time = "                    + System.currentTimeMillis());            Thread.sleep(3000);            System.out.println("B end");        } catch (InterruptedException e) {            e.printStackTrace();        }    }}public class Sync1ThreadA extends Thread{    private Sync1Object object;    public Sync1ThreadA(Sync1Object object) {        this.object = object;    }    @Override    public void run() {        super.run();        object.methodA();    }}public class Sync1ThreadB extends Thread{    private Sync1Object object;    public Sync1ThreadB(Sync1Object object) {        this.object = object;    }    @Override    public void run() {        super.run();        object.methodB();    }}public class ThreadRunMain {    public static void main(String[] args) {        testSync1Thread();    }    public static void testSync1Thread(){        try {            Sync1Object object = new Sync1Object();            Sync1ThreadA a = new Sync1ThreadA(object);            a.setName("A");            a.start();            Thread.sleep(100);            Sync1ThreadB b = new Sync1ThreadB(object);            b.setName("B");            b.start();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

运行结果:

 

  • A线程先持有object对象的Lock锁,B线程如果在这个时候调用object对象中的synchronized类型的方法则需要等待,同步串行执行。
public class Sync1Object {    synchronized public void methodA() {        try {            System.out.println("begin methodA threadName = "                    + Thread.currentThread().getName());            Thread.sleep(5000);            System.out.println("A end endTime = " + System.currentTimeMillis());        } catch (InterruptedException e) {            e.printStackTrace();        }    }     synchronized public void methodB() {        try {            System.out.println("begin methodB threadName = "                    + Thread.currentThread().getName() + " begin time = "                    + System.currentTimeMillis());            Thread.sleep(3000);            System.out.println("B end");        } catch (InterruptedException e) {            e.printStackTrace();        }    }}public class Sync1ThreadA extends Thread{    private Sync1Object object;    public Sync1ThreadA(Sync1Object object) {        this.object = object;    }    @Override    public void run() {        super.run();        object.methodA();    }}public class Sync1ThreadB extends Thread{    private Sync1Object object;    public Sync1ThreadB(Sync1Object object) {        this.object = object;    }    @Override    public void run() {        super.run();        object.methodB();    }}public class ThreadRunMain {    public static void main(String[] args) {        testSync1Thread();    }    public static void testSync1Thread(){        try {            Sync1Object object = new Sync1Object();            Sync1ThreadA a = new Sync1ThreadA(object);            a.setName("A");            a.start();            Thread.sleep(100);            Sync1ThreadB b = new Sync1ThreadB(object);            b.setName("B");            b.start();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

运行结果:

 

转载于:https://www.cnblogs.com/AK47Sonic/p/7710626.html

你可能感兴趣的文章
悲观锁和乐观锁使用场景
查看>>
Oracle 12c: RMAN restore/recover pluggable database
查看>>
substance新版及问题
查看>>
centOSmini安装教程
查看>>
Android开发之SoundPool使用具体解释
查看>>
Handlebars.js 模板引擎
查看>>
[转]hibernate在eclipse的逆向工程生成hbm.xml和bean类
查看>>
【数据结构与算法】二叉树深度遍历(递归)
查看>>
iOS开发--基于AFNetWorking3.0的图片缓存分析
查看>>
使用jqMobi开发app基础:弹出内容的设计
查看>>
3.Java集合总结系列:Set接口及其实现
查看>>
ExtJs之Element.select函数
查看>>
驱动程序调试方法之printk——自制proc文件(一)
查看>>
Swift 可选类型-备
查看>>
使用开源软件的原因
查看>>
数据结构和算法 – 10.集合
查看>>
关于新版SDK报错You need to use a Theme.AppCompat theme的两种解决办法
查看>>
Trace Sys
查看>>
Fiddler2 中文手册
查看>>
微信热门话题榜要上线了?腾讯微博的变身?
查看>>