一.运用synchronized关键字

首先我们来看看一个多线程中线程不安全的列子

代码如下:

共享数据类:

public class NotSynchronizated extends Thread {
private int num =10;
@Override
public void run(){
try {
System.out.println("当前线程为:"+currentThread().getName());
num--;
System.out.println("num的值为:"+num);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

线程测试类:

public class Text {

    public static void main(String[] args) {
//将共享数据放入3个线程里进行处理
NotSynchronizated notSynchronizated = new NotSynchronizated();
Thread t1=new Thread(notSynchronizated,"A");
Thread t2=new Thread(notSynchronizated,"B");
Thread t3=new Thread(notSynchronizated,"C");
Thread t4=new Thread(notSynchronizated,"D");
t1.start();
t2.start();
t3.start();
t4.start();
}
}

在这个列子中run方法没有使用关键字synchronized,那么就会造成线程不安全,结果如下:

 

那么当我们使用关键字synchronized后结果就会同步了,结果如下:

那么,在这里是对这个run方法进行了同步呢?还是对这个对象进行了同步呢?

二.synchronized同步的是对象

为了证明synchronized同步的是对象,我们举出下面的代码:

共享资源类:

public class SynchronizatedObject extends Thread {
private int num=20;
@Override
public synchronized void run(){ System.out.println("当前的线程为"+currentThread().getName());
num--;
System.out.println("当前num为"+num);
} }

测试类:

public class Text {

    public static void main(String[] args) {
SynchronizatedObject synchronizatedObject1=new SynchronizatedObject();//创建第一个资源共享类
SynchronizatedObject synchronizatedObject2=new SynchronizatedObject();//创建第二个资源共享类
Thread t1=new Thread(synchronizatedObject1,"A");//加入
Thread t2=new Thread(synchronizatedObject2,"B");//加入
t1.start();
t2.start();
}
}

结果如下:

从这里明显看出这个synchronized关键字同步的是对象而不是方法,

如果同步的是方法那么他将不会出现这种线程不安全的情况,而是两对象一个一个按顺序的进入这个同步的方法里,

出现这中情况,只能说明他是对象同步的。

所以说这段代码意思是我创建了两个对象,同时我也创建了两把对象锁来同步话各自的run方法,只不过每一条线程的调用顺序不同才会出现这样的结果。

总结:synchronized关键字同步的是对象不是方法

深入理解synchronized方法同步的是方法还是对象?的更多相关文章

  1. java 多线程: Thread 并发访问-代码块同步synchronized {};String作为被锁的对象

    方法同步的弊端 方法同步的时候,如果一个方法需要线程安全控制的代码速度其实很快,但是还有其他的业务逻辑代码耗时非常长(比如网络请求),这样所有的线程就在这一块就等待着了,这样造成了极大的资源浪费如果并 ...

  2. 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

    问题一:多线程有几种实现方法?同步有几种实现方法? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口   同步的实现方面有两种,分别是synchronized,wait与not ...

  3. java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合

    1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...

  4. 牛客网Java刷题知识点之多线程同步的实现方法有哪些

    不多说,直接上干货! 为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),  将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避 ...

  5. synchronized(6)修饰语方法之:static方法

    当一个synchronized关键字修饰的方法同时又被static修饰,之前说过,非静态的同步方法会将对象上锁,但是静态方法不属于对象,而是属于类,它会将这个方法所在的类的Class对象上锁. 一个类 ...

  6. 理解JAVA - 面向对象(object) - 属性,方法

    理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...

  7. 深入理解javascript中实现面向对象编程方法

    介绍Javascript中面向对象编程思想之前,需要对以下几个概念有了解: 1. 浅拷贝和深拷贝:程序在运行过程中使用的变量有在栈上的变量和在堆上的变量,在对象或者变量的赋值操作过程中,大多数情况先是 ...

  8. C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法。

    原文:C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法. 一般我们在撰写Windows Phone ...

  9. synchronized修饰static方法与非static方法的区别

    1. 当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例),作用范围是整个静态方法,作用的对象是这个类的所有对象. 2. 当synchron ...

随机推荐

  1. ★Pandas 零碎知识

    1 修改属性 1.1 修改1列的类型属性: df['总金额'] = pd.to_numeric(df['总金额']) #转变dataframe的1列为数值型 1.2 多列设为数值型:(使用DataFr ...

  2. Java Networking: UDP DatagramSocket (翻译)

    原文:http://tutorials.jenkov.com/java-networking/udp-datagram-sockets.html UDP vs. TCP Sending Data vi ...

  3. Container的简单认识

    容器是一个标准的软件单元,它将代码及其所有依赖关系打包,以便应用程序从一个计算环境快速可靠地运行到另一个计算环境. Docker容器映像是一个轻量级,独立的可执行软件包,包含运行应用程序所需的一切:代 ...

  4. Canonical Coin Systems【完全背包】

    问题 C: Canonical Coin Systems 时间限制: 1 Sec  内存限制: 128 MB 提交: 200  解决: 31 [提交] [状态] [命题人:admin] 题目描述 A ...

  5. ipan笔记

    // 对于mysql来说, 如果字段没有设置其 default值, 则会自动 设置 default值为null.同理没有设置not null, 则会自动允许null =yes // create ta ...

  6. 论文阅读:Deep Attentive Tracking via Reciprocative Learning

    Deep Attentive Tracking via Reciprocative Learning 2018-11-14 13:30:36 Paper: https://arxiv.org/abs/ ...

  7. (转载)Unity UGUI鼠标点击UI不受影响方法IsPointerOverGameObject

    这几天在做捕鱼达人游戏时发现,当鼠标点击UI时,炮台的子弹也会发射子弹,这样会影响用户体验. 然后网上百度了一波,发现在UGUI系统上,EventSystem提供了一些方法.那就是EventSyste ...

  8. Springboot解决war包放到Tomcat服务器上404的特殊情况

    Springboot解决war包放到Tomcat服务器上404的特殊情况 原文链接:https://www.cnblogs.com/blog5277/p/9330577.html 原文作者:博客园-- ...

  9. win8外包公司——技术分享:参数传递

    页面之间传递参数 windows phone 的参数传递和web 差不多.用“?”号传递 多个参数的时候用 “&”做分隔. 我接着昨天的项目继续添加一个FourPage.xaml 在昨天的Th ...

  10. B站(Bilibili) 视频的下载。

    1) 第一种是众所周知的方法,在URL的 bilibili 前加个 i, 就可以有视频的mp4的地址,然后用下载器下载. 比如 想 下载 https://www.bilibili.com/video/ ...