缺陷:用关键字synchronized声明方法是有弊端的,譬如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待较长的时间,

解决方法:使用synchronized同步语句块

  1. package com.cky.utils;
  2.  
  3. /**
  4. * Created by chenkaiyang on 2017/12/6.
  5. */
  6. public class Task {
  7. private String getData1;
  8. private String getData2;
  9. public synchronized void doLongTimeTask() {
  10. try {
  11. System.out.println("begin task");
  12. Thread.sleep();
  13. getData1 = "长时间处理任务后从远程返回的值 1 ThreadName="+ Thread.currentThread().getName();
  14. getData2 = "长时间处理任务后从远程返回的值 2 ThreadName="+ Thread.currentThread().getName();
  15. System.out.println(getData1);
  16. System.out.println(getData2);
  17. System.out.println("end");
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. }
  1. package com.cky.utils;
  2.  
  3. /**
  4. * Created by chenkaiyang on 2017/12/6.
  5. */
  6. public class CommonUtils {
  7. public static long beginTime1;
  8. public static long endTime1;
  9. public static long beginTime2;
  10. public static long endTime2;
  11. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.utils.CommonUtils;
  4. import com.cky.utils.Task;
  5.  
  6. /**
  7. * Created by chenkaiyang on 2017/12/6.
  8. */
  9. public class MyThreadA extends Thread{
  10. private Task task;
  11. public MyThreadA (Task task) {
  12. this.task = task;
  13. }
  14. @Override
  15. public void run() {
  16. super.run();
  17. CommonUtils.beginTime1 = System.currentTimeMillis();
  18. task.doLongTimeTask();
  19. CommonUtils.endTime1 = System.currentTimeMillis();
  20. }
  21. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.utils.CommonUtils;
  4. import com.cky.utils.Task;
  5.  
  6. /**
  7. * Created by chenkaiyang on 2017/12/6.
  8. */
  9. public class MyThreadB extends Thread{
  10. private Task task;
  11. public MyThreadB (Task task) {
  12. this.task = task;
  13. }
  14. @Override
  15. public void run() {
  16. super.run();
  17. CommonUtils.beginTime2 = System.currentTimeMillis();
  18. task.doLongTimeTask();
  19. CommonUtils.endTime2 = System.currentTimeMillis();
  20. }
  21. }
  1. package com.cky.test;
  2.  
  3. import com.cky.thread.MyThreadA;
  4. import com.cky.thread.MyThreadB;
  5. import com.cky.utils.CommonUtils;
  6. import com.cky.utils.Task;
  7.  
  8. /**
  9. * Created by chenkaiyang on 2017/12/2.
  10. */
  11. public class Test {
  12. public static void main(String[] args){
  13. Task task = new Task();
  14. MyThreadA myThreadA = new MyThreadA(task);
  15. myThreadA.start();
  16. MyThreadB myThreadB = new MyThreadB(task);
  17. myThreadB.start();
  18. try {
  19. Thread.sleep();
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. long beginTime = (CommonUtils.beginTime2 <CommonUtils.beginTime1?CommonUtils.beginTime2:CommonUtils.beginTime1);
  24. long endTime = (CommonUtils.endTime2> CommonUtils.endTime1?CommonUtils.endTime2:CommonUtils.endTime1);
  25. System.out.println("耗时"+ (endTime- beginTime)/);
  26.  
  27. }
  28. }
  1. D:\it\jdk1.\bin\java -Didea.launcher.port= "-Didea.launcher.bin.path=D:\it\idea\IntelliJ IDEA 2016.3.3\bin" -Dfile.encoding=UTF- -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 task
  3. 长时间处理任务后从远程返回的值 ThreadName=Thread-
  4. 长时间处理任务后从远程返回的值 ThreadName=Thread-
  5. end
  6. begin task
  7. 长时间处理任务后从远程返回的值 ThreadName=Thread-
  8. 长时间处理任务后从远程返回的值 ThreadName=Thread-
  9. end
  10. 耗时6

程序运行了大约6秒。

需要使用同步代码块来解决。

2.2.1synchronized方法的弊端的更多相关文章

  1. 【MyBatis学习03】原始dao开发方法及其弊端

    上一篇博文总结了一下mybatis的入门,接下来就要开发dao方法了,这篇博文主要总结一下mybatis中原始dao开发的方法,最后并总结一下原始dao开发方法的弊端.mybatis中dao开发应该使 ...

  2. java多线程编程核心技术——第二章

    第一节synchronized同步方法目录 1.1方法内的变量为线程安全的 1.2实例变量非线程安全 1.3多个对象多个锁 1.4synchronized方法与锁对象 1.5脏读 1.6synchro ...

  3. java多线程编程核心技术——第二章总结

    第一节synchronized同步方法目录 1.1方法内的变量为线程安全的 1.2实例变量非线程安全 1.3多个对象多个锁 1.4synchronized方法与锁对象 1.5脏读 1.6synchro ...

  4. 2.2synchronized同步语句块

    使用synchronized虽然能够避免不同步的现象出现,但是也会出现弊端,比如代码执行时间过长,那么其他线程就必须等待该线程执行完毕释放锁之后才能拿到锁. 面对这种问题可以使用同步代码块来解决. 2 ...

  5. 字体属性设置(一):谷歌浏览器12px以下字体的显示;方法和原理

    前言: chrome 谷歌浏览器默认的字体大小为16px:可以通过设置font-size来设置字体大小但是当设置到12px以下的时候字体大小不再改变:对于想设置其他大小的字体就很头疼,本文参考网上的方 ...

  6. 清理SQL Server日志释放文件空间的终极方法

    清理SQL Server日志释放文件空间的终极方法  转自:http://www.cnblogs.com/dudu/archive/2013/04/10/3011416.html [问题场景]有一个数 ...

  7. [改善Java代码]不使用stop方法停止线程

    线程启动完毕后,在运行可能需要终止,Java提供的终止方法只有一个stop,但是不建议使用此方法,因为它有以下三个问题: (1)stop方法是过时的 从Java编码规则来说,已经过时的方式不建议采用. ...

  8. css清除浮动的几种方法整理

    四种清除浮动方法如下: 1.使用空标签清除浮动.空标签可以是div标签,也可以是P 标签.这种方式是在需要清除浮动的父级元素内部的所有浮动元素后添加这样一个标签 清除浮动,并为其定义CSS代码:cle ...

  9. CSS清除浮动的方法

    CSS清除浮动的方法有哪些呢?经常性地会使用到float,很多邪门的事儿都有可能是浮动在作怪,清除浮动是必须要做的,而且随时性地对父级元素清除浮动的做法也被认为是书写CSS的良好习惯之一.下面看今天的 ...

随机推荐

  1. LIS LCS 最长上升子序列 最长公共子序列 ...

    最长上升子序列,问题定义:http://blog.csdn.net/chenwenshi/article/details/6027086 代码: public static void getData( ...

  2. Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not mat

    Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b ...

  3. org.apache.commons.net.ftp

    org.apache.commons.NET.ftp Class FTPClient类FTPClient java.lang.Object Java.lang.Object继承 org.apache. ...

  4. html标签二

    1.没有前后顺序的信息列表<ul> <li></li> <li></li></ul>2.有序列表 <ol>  < ...

  5. Liunx read

    read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 1)read后面的变量var可以只有一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据 ...

  6. fastdfs 上传图片 完整版

    1.jsp文件 <%@ page language="java" import="java.util.*" pageEncoding="UTF- ...

  7. gerrit管理下的git代码提交小技巧

    1.提交代码git checkout targetbranch 切换至目标分支git pull origin targetbranch 拉取目标分支最新内容git add 修改文件git commit ...

  8. Javascript的一个怪现象

    javascript有一个怪现象,就是减法也会导致小数位数问题,是一个麻烦的问题,比如. <html><script> var a=10,b=20.1; alert( a - ...

  9. 适合新手小白的UI学习路线完整版

    UI设计是很多年轻人活着想转行学习的人的新职业目标,越来越多的人看到UI设计良好的就业发展前景,纷纷投入到UI设计的大军中来,想学习UI设计,很多小白并不知道从何开始学起,用什么样的方法去学习,所以今 ...

  10. Centos 装系统 配置网卡,校准时间

    Vclient -控制台: 1.编辑网卡,第一块为外网,第二块为内网 #vi /etc/sysconfig/network-scripts/ifcfg-ens160 TYPE=Ethernet NAM ...