为了证明线程锁的是对象

测试

  1. package com.cky.bean;
  2.  
  3. /**
  4. * Created by chenkaiyang on 2017/12/4.
  5. */
  6. public class MyObject {
  7. public void methodA () {
  8. try {
  9. System.out.println("begin methodA ThName=" +Thread.currentThread().getName());
  10. Thread.sleep(5000);
  11. System.out.println("end");
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.bean.MyObject;
  4.  
  5. /**
  6. * Created by chenkaiyang on 2017/12/4.
  7. */
  8. public class ThreadA extends Thread{
  9. private MyObject mo;
  10. public ThreadA (MyObject mo) {
  11. this.mo = mo;
  12. }
  13. @Override
  14. public void run() {
  15. super.run();
  16. mo.methodA();
  17. }
  18. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.bean.MyObject;
  4.  
  5. /**
  6. * Created by chenkaiyang on 2017/12/4.
  7. */
  8. public class ThreadB extends Thread{
  9. private MyObject mo;
  10. public ThreadB (MyObject mo) {
  11. this.mo = mo;
  12. }
  13. @Override
  14. public void run() {
  15. super.run();
  16. mo.methodA();
  17. }
  18. }
  1. package com.cky.test;
  2.  
  3. import com.cky.bean.MyObject;
  4. import com.cky.thread.ThreadA;
  5. import com.cky.thread.ThreadB;
  6.  
  7. /**
  8. * Created by chenkaiyang on 2017/12/2.
  9. */
  10. public class Test {
  11. public static void main(String[] args){
  12. MyObject myObject = new MyObject();
  13. ThreadA threadA = new ThreadA(myObject);
  14. threadA.setName("A");
  15. ThreadB threadB = new ThreadB(myObject);
  16. threadB.setName("B");
  17. threadA.start();
  18. threadB.start();
  19. }
  20. }
  1. D:\it\jdk1.8\bin\java -Didea.launcher.port=7533 "-Didea.launcher.bin.path=D:\it\idea\IntelliJ IDEA 2016.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\it\jdk1.8\jre\lib\charsets.jar;D:\it\jdk1.8\jre\lib\deploy.jar;D:\it\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\it\jdk1.8\jre\lib\ext\cldrdata.jar;D:\it\jdk1.8\jre\lib\ext\dnsns.jar;D:\it\jdk1.8\jre\lib\ext\jaccess.jar;D:\it\jdk1.8\jre\lib\ext\jfxrt.jar;D:\it\jdk1.8\jre\lib\ext\localedata.jar;D:\it\jdk1.8\jre\lib\ext\nashorn.jar;D:\it\jdk1.8\jre\lib\ext\sunec.jar;D:\it\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\it\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\it\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\it\jdk1.8\jre\lib\ext\zipfs.jar;D:\it\jdk1.8\jre\lib\javaws.jar;D:\it\jdk1.8\jre\lib\jce.jar;D:\it\jdk1.8\jre\lib\jfr.jar;D:\it\jdk1.8\jre\lib\jfxswt.jar;D:\it\jdk1.8\jre\lib\jsse.jar;D:\it\jdk1.8\jre\lib\management-agent.jar;D:\it\jdk1.8\jre\lib\plugin.jar;D:\it\jdk1.8\jre\lib\resources.jar;D:\it\jdk1.8\jre\lib\rt.jar;F:\springboot\threaddemo\out\production\threaddemo;D:\it\idea\IntelliJ IDEA 2016.3.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.cky.test.Test
  2. begin methodA ThName=A
  3. begin methodA ThName=B
  4. end
  5. end

结果如上分析,代码调用是异步随机执行。

然后在方法中加同步关键字

  1. package com.cky.bean;
  2.  
  3. /**
  4. * Created by chenkaiyang on 2017/12/4.
  5. */
  6. public class MyObject {
  7. synchronized public void methodA () {
  8. try {
  9. System.out.println("begin methodA ThName=" +Thread.currentThread().getName());
  10. Thread.sleep(5000);
  11. System.out.println("end");
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  1. D:\it\jdk1.8\bin\java -Didea.launcher.port=7534 "-Didea.launcher.bin.path=D:\it\idea\IntelliJ IDEA 2016.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\it\jdk1.8\jre\lib\charsets.jar;D:\it\jdk1.8\jre\lib\deploy.jar;D:\it\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\it\jdk1.8\jre\lib\ext\cldrdata.jar;D:\it\jdk1.8\jre\lib\ext\dnsns.jar;D:\it\jdk1.8\jre\lib\ext\jaccess.jar;D:\it\jdk1.8\jre\lib\ext\jfxrt.jar;D:\it\jdk1.8\jre\lib\ext\localedata.jar;D:\it\jdk1.8\jre\lib\ext\nashorn.jar;D:\it\jdk1.8\jre\lib\ext\sunec.jar;D:\it\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\it\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\it\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\it\jdk1.8\jre\lib\ext\zipfs.jar;D:\it\jdk1.8\jre\lib\javaws.jar;D:\it\jdk1.8\jre\lib\jce.jar;D:\it\jdk1.8\jre\lib\jfr.jar;D:\it\jdk1.8\jre\lib\jfxswt.jar;D:\it\jdk1.8\jre\lib\jsse.jar;D:\it\jdk1.8\jre\lib\management-agent.jar;D:\it\jdk1.8\jre\lib\plugin.jar;D:\it\jdk1.8\jre\lib\resources.jar;D:\it\jdk1.8\jre\lib\rt.jar;F:\springboot\threaddemo\out\production\threaddemo;D:\it\idea\IntelliJ IDEA 2016.3.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.cky.test.Test
  2. begin methodA ThName=A
  3. end
  4. begin methodA ThName=B
  5. end

结果分析:

调用关键字synchronized声明的方法一定是排队运行的,只有共享的资源才需要同步,如果不是共享的资源,根本没有必要同步。

那如果其他的方法被调用会有什么效果。

测试

继续更改MyObject

  1. package com.cky.bean;
  2.  
  3. /**
  4. * Created by chenkaiyang on 2017/12/4.
  5. */
  6. public class MyObject {
  7. synchronized public void methodA () {
  8. try {
  9. System.out.println("begin methodA ThName=" +Thread.currentThread().getName());
  10. Thread.sleep(5000);
  11. System.out.println("end");
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. public void methodB() {
  17. try {
  18. System.out.println("begin methodB ThName=" +Thread.currentThread().getName());
  19. Thread.sleep(5000);
  20. System.out.println("end");
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.bean.MyObject;
  4.  
  5. /**
  6. * Created by chenkaiyang on 2017/12/4.
  7. */
  8. public class ThreadA extends Thread{
  9. private MyObject mo;
  10. public ThreadA (MyObject mo) {
  11. this.mo = mo;
  12. }
  13. @Override
  14. public void run() {
  15. super.run();
  16. mo.methodA();
  17. }
  18. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.bean.MyObject;
  4.  
  5. /**
  6. * Created by chenkaiyang on 2017/12/4.
  7. */
  8. public class ThreadB extends Thread{
  9. private MyObject mo;
  10. public ThreadB (MyObject mo) {
  11. this.mo = mo;
  12. }
  13. @Override
  14. public void run() {
  15. super.run();
  16. mo.methodB();
  17. }
  18. }
  1. package com.cky.test;
  2.  
  3. import com.cky.bean.MyObject;
  4. import com.cky.thread.ThreadA;
  5. import com.cky.thread.ThreadB;
  6.  
  7. /**
  8. * Created by chenkaiyang on 2017/12/2.
  9. */
  10. public class Test {
  11. public static void main(String[] args){
  12. MyObject myObject = new MyObject();
  13. ThreadA threadA = new ThreadA(myObject);
  14. threadA.setName("A");
  15. ThreadB threadB = new ThreadB(myObject);
  16. threadB.setName("B");
  17. threadA.start();
  18. threadB.start();
  19. }
  20. }
  1. D:\it\jdk1.8\bin\java -Didea.launcher.port=7536 "-Didea.launcher.bin.path=D:\it\idea\IntelliJ IDEA 2016.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\it\jdk1.8\jre\lib\charsets.jar;D:\it\jdk1.8\jre\lib\deploy.jar;D:\it\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\it\jdk1.8\jre\lib\ext\cldrdata.jar;D:\it\jdk1.8\jre\lib\ext\dnsns.jar;D:\it\jdk1.8\jre\lib\ext\jaccess.jar;D:\it\jdk1.8\jre\lib\ext\jfxrt.jar;D:\it\jdk1.8\jre\lib\ext\localedata.jar;D:\it\jdk1.8\jre\lib\ext\nashorn.jar;D:\it\jdk1.8\jre\lib\ext\sunec.jar;D:\it\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\it\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\it\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\it\jdk1.8\jre\lib\ext\zipfs.jar;D:\it\jdk1.8\jre\lib\javaws.jar;D:\it\jdk1.8\jre\lib\jce.jar;D:\it\jdk1.8\jre\lib\jfr.jar;D:\it\jdk1.8\jre\lib\jfxswt.jar;D:\it\jdk1.8\jre\lib\jsse.jar;D:\it\jdk1.8\jre\lib\management-agent.jar;D:\it\jdk1.8\jre\lib\plugin.jar;D:\it\jdk1.8\jre\lib\resources.jar;D:\it\jdk1.8\jre\lib\rt.jar;F:\springboot\threaddemo\out\production\threaddemo;D:\it\idea\IntelliJ IDEA 2016.3.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.cky.test.Test
  2. begin methodA ThName=A
  3. begin methodB ThName=B
  4. end
  5. end

结果分析:虽然线程A先持有object对象的锁,但是线程B完全可以异步调用非synchronized类型的方法。

继续再methodB方法上加上synchronized

  1. package com.cky.bean;
  2.  
  3. /**
  4. * Created by chenkaiyang on 2017/12/4.
  5. */
  6. public class MyObject {
  7. synchronized public void methodA () {
  8. try {
  9. System.out.println("begin methodA ThName=" +Thread.currentThread().getName());
  10. Thread.sleep(5000);
  11. System.out.println("end");
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. synchronized public void methodB() {
  17. try {
  18. System.out.println("begin methodB ThName=" +Thread.currentThread().getName());
  19. Thread.sleep(5000);
  20. System.out.println("end");
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  1. D:\it\jdk1.8\bin\java -Didea.launcher.port=7537 "-Didea.launcher.bin.path=D:\it\idea\IntelliJ IDEA 2016.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\it\jdk1.8\jre\lib\charsets.jar;D:\it\jdk1.8\jre\lib\deploy.jar;D:\it\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\it\jdk1.8\jre\lib\ext\cldrdata.jar;D:\it\jdk1.8\jre\lib\ext\dnsns.jar;D:\it\jdk1.8\jre\lib\ext\jaccess.jar;D:\it\jdk1.8\jre\lib\ext\jfxrt.jar;D:\it\jdk1.8\jre\lib\ext\localedata.jar;D:\it\jdk1.8\jre\lib\ext\nashorn.jar;D:\it\jdk1.8\jre\lib\ext\sunec.jar;D:\it\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\it\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\it\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\it\jdk1.8\jre\lib\ext\zipfs.jar;D:\it\jdk1.8\jre\lib\javaws.jar;D:\it\jdk1.8\jre\lib\jce.jar;D:\it\jdk1.8\jre\lib\jfr.jar;D:\it\jdk1.8\jre\lib\jfxswt.jar;D:\it\jdk1.8\jre\lib\jsse.jar;D:\it\jdk1.8\jre\lib\management-agent.jar;D:\it\jdk1.8\jre\lib\plugin.jar;D:\it\jdk1.8\jre\lib\resources.jar;D:\it\jdk1.8\jre\lib\rt.jar;F:\springboot\threaddemo\out\production\threaddemo;D:\it\idea\IntelliJ IDEA 2016.3.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.cky.test.Test
  2. begin methodB ThName=B
  3. end
  4. begin methodA ThName=A
  5. end
  6.  
  7. Process finished with exit code 0

结果分析:

1)A线程先持有对象锁,B线程可以异步方法调用object对象中非同步的方法

2)A线程先持有对象锁,B线程此时如果想要调用B线程中其他的同步方法,则需要等待A线程释放才行

2.1.4synchronized方法与锁对象的更多相关文章

  1. 【翻译十八】java-并发之锁对象

    Lock Objects Synchronized code relies on a simple kind of reentrant lock. This kind of lock is easy ...

  2. 锁对象Lock

    Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题: public class LockTest { publicstaticv ...

  3. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

  4. 锁对象-Lock: 同步问题更完美的处理方式 (ReentrantReadWriteLock读写锁的使用/源码分析)

    Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...

  5. wait() ,notify() ,notifyAll(),synchronized 和同步方法锁,对象锁的联系,关系,区别;

    一直不明白一个问题,因为在书上关于生产者和消费者的例子里看到一段这样的代码,估计很多人都和我一样迷惑 public synchronized void set(String name, String ...

  6. java锁对象

    在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks 包下面,里面有三个重要的接口 ...

  7. SAP 锁对象 基本概念与基本操作 SE11

      一.SAP为什么要设置锁:     1,保持数据的一致性     假设几个用户要訪问相同的资源,须要找到一种同步訪问的方法去保持数据的一致性.比方说,在航班预订系统中,须要检查还有没有空座位,当检 ...

  8. Java 学习笔记之 Synchronized锁对象

    Synchronized锁对象: Synchronized取得的锁都是对象锁,而不是把一段代码或方法当作锁,哪个线程执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,那么其 ...

  9. 锁对象Lock-同步问题更完美的处理方式

    Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...

随机推荐

  1. (五)ROS节点

    一. 理解ROS 节点: ROS的节点: 可以说是一个可运行的程序.当然这个程序可不简单.因为它可以接受来自ROS网络上其他可运行程序的输出信息,也可以发送信息给ROS网络,被其他 ROS 可运行程序 ...

  2. linux高级编程——IO

    1,文件IO 1)open——打开或创建一个文件 open(char *,flag,mode)在fcntl.h文件中声明. 参数: char * 包含有文件名和路径 flag 打开文件方式 mode ...

  3. three.js raycaster射线碰撞的坑 (当canvas大小 不是屏幕大小是解决拾取物体的办法)

    这里只是记录一下坑,方便查阅,内容主要援引自:three.js Raycaster 射线拾取 canvas不占满整屏时射线拾取存在偏差 1. 世界坐标系: 世界坐标系位于屏幕的中心(0,0,0),往右 ...

  4. DevExpress XPO 开发指南 简要

    最近在看devexpress   安装程序中的代码Demos ..  C:\Users\Public\Documents\DevExpress Demos 16.1\Components\WinFor ...

  5. Informatica_(3)组件

    一.Informatica介绍Informatica PowerCenter 是Informatica公司开发的世界级的企业数据集成平台,也是业界领先的ETL工具.Informatica PowerC ...

  6. String 练习

    package com.hanqi; import java.util.Random; public class Text { public static void main(String[] arg ...

  7. linux查看文件被哪个进程占用?

    1> 如果文件是端口号 netstat -ntlp | grep portNum [root@localhost root]# netstat -ntlp Active Internet con ...

  8. collectionView 防止cell复用的方法

    collectionView 防止cell复用的方法 一: //在创建collectionView的时候注册cell(一个分区) UICollectionViewCell *cell=[collect ...

  9. Luogu 2157 [SDOI2009]学校食堂 - 状压dp

    Solution 比较好想的dp, 但是坑不少QAQ, 调半天 由于容忍度 $b_i$<= 7, 所以可以考虑将第$i$个人接下来的$b_i$ 个人作为一个维度记录状态. 于是我们定义数组$f[ ...

  10. vim 中将 TAB 换成 4 个空格

    最近开始学习Python,其语法简单,但是对代码格式要求比较严格.代码采用缩进方式,按照约定采用4个空格的缩进. Linux下配置vim编辑器中Tab键为4个空格方法: 1. 编辑文件: vi /et ...