深入理解使用synchronized同步方法和同步代码块的区别
一.代码块和方法之间的区别
首先需要知道代码块和方法有什么区别:
构造器和方法块,构造器可以重载也就是说明在创建对象时可以按照不同的构造器来创建,那么构造器是属于对象,而代码块呢他是给所有的对象初始化的。底下看一个列子:
public class Constructor_Methodblock {
private int num;
private String str;
//构造器
public Constructor_Methodblock(int num,String str){
System.out.println("\n************构造器****************");
System.out.println("在进入构造器之前成员变量的值为num:"+this.num+"str: "+this.str);
this.str=str;
this.num=num;
System.out.println("赋值之后num为"+num+"str为"+str);
}
//方法块
{
System.out.println("\n************代码块****************");
System.out.println("在进入方法块之前成员变量的值为num:"+num+"str: "+str);
num=1;
str="li";
System.out.println("赋值之后num为"+num+"str为"+str);
}
public static void main(String[] args) {
new Constructor_Methodblock(2,"fei");
}
}
结果为:
发现代码块比构造器早执行,而且代码块是所有的对象都要执行的。
现在我们对代码块和方法有了一定的了解,那么同步方法有什么缺点使得我们需要同步代码块呢?
二.同步方法的缺点
来想象一个这样的情况:一个方法其中有一部分是需要计算数据花费时间不是那么长但是还有一部分他不需要处理数据但是他需要花费大量的时间,那么如果我们直接将这个方法同步化会导致整体的代码性能下降,而我们仅仅将这个计算数据部分同步保证共享数据计算没有问题,那么代码性能是不是就上去了呢?
来看直接同步化方法:
public class SynFun extends Thread {
private int num=10;//共享数据
@Override
public void run(){
try {
this.fun();//调用同步方法
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void fun() throws InterruptedException {
//使用睡眠来模拟一下复杂但是对数据处理没有关系的部分,睡眠三秒
Thread.sleep(3000);
System.out.println("修改前的num为"+num);
num--;
System.out.println("修改后的num为"+num);
System.out.println("*************");
}
public static void main(String[] args) {
SynFun synFun=new SynFun();
Thread t1=new Thread(synFun);
Thread t2=new Thread(synFun);
t1.start();
t2.start();
}
}
结果为:
出现结果时,先等待了三秒出现了第一个结果,在等待了三秒又出现了第二个结果。
改进一下:
public void fun() throws InterruptedException {
//使用睡眠来模拟一下复杂但是对数据处理没有关系的部分,睡眠三秒
Thread.sleep(3000);
synchronized (this){
System.out.println("修改前的num为"+num);
num--;
System.out.println("修改后的num为"+num);
}
System.out.println("*************");
}
就是利用同步化代码块,将共享数据处理的部分同步起来,而其他的部分就让他去交叉运行吧。
结果是一样的,但是出现结果就是三秒以后直接出现两个答案,说明整体性能直接上去了。
******************************************************题外话***********************************************************
Java多线程专题已经已经发表了五篇博客了,不少前辈(其实我还是一个大二的学生)都给出了很好的讲解和指导,在这里真的非常感谢你们。
if(对我的博客感兴趣){
点赞+关注;
}else{
没有else
}
深入理解使用synchronized同步方法和同步代码块的区别的更多相关文章
- synchronized同步方法和同步代码块的区别
同步方法默认使用this或者当前类做为锁. 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不是整个方法. 同步方法使用synchronized修 ...
- 牛客网Java刷题知识点之同步方法和同步代码块的区别(用synchronized关键字修饰)
不多说,直接上干货! 扩展博客 牛客网Java刷题知识点之多线程同步的实现方法有哪些 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查 ...
- java的同步方法和同步代码块,对象锁,类锁区别
/** * @author admin * @date 2018/1/12 9:48 * 作用在同一个实例对象上讨论 * synchronized同步方法的测试 * 两个线程,一个线程调用synchr ...
- 对象及变量的并发访问(同步方法、同步代码块、对class进行加锁、线程死锁)&内部类的基本用法
主要学习多线程的并发访问,也就是使得线程安全. 同步的单词为synchronized,异步的单词为asynchronized 同步主要就是通过锁的方式实现,一种就是隐式锁,另一种是显示锁Lock,本节 ...
- 同步方法、同步代码块、volidate变量的使用
当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线程改过了. ...
- synchronized修饰方法和代码块的区别
先看一段代码 Class A { public synchronized methodA() {//对当前对象加锁 } public methodB() { synchronized(this){}/ ...
- Java的synchronized的同步代码块和同步方法的区别
synchronized同步方法和同步代码块的区别 同步方法默认使用this或者当前类做为锁. 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不 ...
- 线程同步 synchronized 同步代码块 同步方法 同步锁
一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
随机推荐
- npm 清理缓存
npm cache clean -f 有些时候npm下载资源出错,再次下载的时候可能因为之前错误的缓存造成一直下载不成功. 此时可以清一下npm的缓存,然后尝试重新下载
- VS2015 scanf 函数报错 error C4996: 'scanf'
错误提示:error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. ...
- org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'null' to required type 'double' for property 'band'; nested exception is org.springframework.core.convert.Con
本文为博主原创,未经允许不得转载: 先将异常粘贴出来: 20:37:26,909 ERROR [com.suning.fucdn.controller.ProductDataStaticsContro ...
- L2-003. 月饼
L2-003. 月饼 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时 ...
- Spring-AOP环绕监听出错
Exception in thread "main" org.springframework.aop.AopInvocationException: Null return val ...
- ONOS架构-概览
这个是阅读https://wiki.onosproject.org/display/ONOS/Architecture+Guide是顺便翻译的,目前断断续续在阅读,今天先贴一部分 概览 基于osgi, ...
- 微信小程序 自定义三列城市弹窗
1.WXML <picker mode="multiSelector" bindchange="bindMultiPickerChange" bindco ...
- xml字符串,xml对象,数组之间的相互转化
<?phpnamespace Home\Controller;use Think\Controller;class IndexController extends Controller { pu ...
- 使用pca/lda降维
PCA主成分分析 import numpy as np import pandas as pd import matplotlib.pyplot as plt # 用鸢尾花数据集 展示 降维的效果 f ...
- 轻松学习java可重入锁(ReentrantLock)的实现原理
转载自https://blog.csdn.net/yanyan19880509/article/details/52345422,(做了一些补充) 前言 相信学过java的人都知道 synchroni ...