与网友讨论之初识同步

原创 2004年09月20日 19:22:00
题记
   
    使用JAVA也有些时间了,头脑里总会闪现出一些似是而非的问题。于是,我考虑建立一个专题,专门来讨论这些问题,初步把它定位在FAQ的形式上。这是第一篇,初步讨论关于同步的问题。
   
    为什么需要同步?
    以下是一简单计数器的例子:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<html>
<body>
    <%!
     public int number;
     private String countFile;
     public int number(){
         try{
             ServletContext application=getServletContext();
             countFile=application.getRealPath("/");      
             BufferedReader file=new BufferedReader(new FileReader(countFile+"hits.txt"));
             number=java.lang.Integer.parseInt(file.readLine());
             number++;
         }
         catch(Exception e){
             System.out.println(e);
         }
         return number;
     }
     public synchronized void counter(){
         number();
         try{
             File f=new File(countFile+"hits.txt");
             PrintWriter pw=new PrintWriter(new FileWriter(f));
             pw.print(number);
             pw.close();
        }
        catch(Exception e){
            System.out.println(e);
        }            
     }
  %>
  <%
  if(session.isNew()){
          counter();    
  }
  out.println(number);
%>
</body>
</html>
    关键词synchronized定义了同步的概念,它可以作为方法修饰符,亦可作为方法内语句。在多线程条件下它限制了对共享资源的访问。方法counter()锁存地获取和释放IO资源,即持有该对象的lock。这种机制可以避免一个线程在进行文件读写操作时,其他线程如果也操作该资源,会抛出异常的情况。
   
    什么时候需要同步机制?
    第一,如果对象的更新影响到只读方法,那么只读方法也应被定义为同步的,例如上面的IO操作。第二,如果两个或两个以上的线程都修改一个对象,那么把执行修改的方法定义为同步的。

    减少同步
    增加无谓的同步控制,几乎和遗漏必要的同步一样糟糕。据文献记载,没有使用同步机制的操作几乎要比使用这一机制的快数倍!原因在于锁存地获取和释放资源,不再通过monitorenter和monitorexit操作码来进行,而是会检查ACC_SYNCHRONIZED属性标记,这一操作是要花费相当的代价。并且,过渡的同步控制可能导致代码死锁,并发度降低。所以应该避免无谓的同步。
   
    注意问题
    synchronized关键词一般用于虚拟锁,锁住的不是方法或代码,而是调用这个方法的对象。例如,对于一个构造函数Test(int n),由于变量n的不同,可以构造出不同的Test对象a和b,如果a、b同时访问同步区域,结果只会使synchronized形同虚设!
    a和b如果要同时访问同步方法,只有该同步方法为static时才能达到同步的目的,否则,a调用a的方法,b调用b的方法,即使方法声明为同步的,但在不同对象域中它们根本达不到同步的目的。

两道蓝桥杯题目

今天练了两道蓝桥杯的题目,感觉题目也不怎么难,打算以后每天都做一两题来练练手。 例题1: 网友年龄 某君新认识一网友。 当问及年龄时,他的网友说: “我的年龄是个2位数,我比儿子大27岁, ...
  • hjf161105
  • hjf161105
  • 2016年11月28日 22:21
  • 1060

JAVA学习第一课(初识JAVA)

PS:退ACM集训队了,自己也疯玩了两天,后天就开学了,就正式大二了,该收收心好好学习啦                                                        ...
  • u013497151
  • u013497151
  • 2014年08月30日 14:51
  • 2207

初识神经网络(1)

神经网络是由简单处理单元构成的大规模并行分布式处理器,天然的具有存储经验知识和使之可用的特性。神经网络在两个方面与大脑相似: 神经网络是通过学习过程从外界环境中获取知识的;互连神经元的连接强度,即突...
  • universe_ant
  • universe_ant
  • 2016年10月02日 12:33
  • 1427

第一章 初识Java

什么是Java语言 Java是于 1995年 由Sun公司推出的 极富创造力的 面向对象程序设计语言 它由Java之父——Sun研究院院士 詹姆斯·高斯林(James Gosling)博士...
  • zsg6221827
  • zsg6221827
  • 2017年03月07日 12:11
  • 191

【redis 基础篇一】redis初识

在JDB来了差不多一个月的时间了,在了解公司业务和框架的过程中,看到了在通过上游调用接口的过程中,使用到了redis来调用值,上游将一个参数传过来,我们通过这个参数去redis中读取部分参数,然后将所...
  • huo065000
  • huo065000
  • 2016年02月28日 18:57
  • 597

iOS开发之OC篇(1)——初识iOS开发

简单介绍编译器Xcode以及开发语言OC。建立一个最简单的工程,打印出“Hello world!”。...
  • u012078168
  • u012078168
  • 2016年07月07日 18:48
  • 177

对于三极管饱和状态的一些浅见——与网友的讨论贴

网友问:2012-10-16 12:16:34   郑老师:这篇大作把三极管的放大和截止两个状态阐述其机理挺明白了。那么还有第三个状态,饱和状态是怎么一个情况? 请问 ...
  • liuyusheng8686
  • liuyusheng8686
  • 2015年10月15日 00:20
  • 404

iOS 关于 设计模式 与网友讨论实录

iOS 关于 设计模式 与网友讨论实录
  • sleks
  • sleks
  • 2014年05月22日 08:31
  • 1147

fastDFS同步问题讨论

一、文件同步延迟问题 前面也讲过fastDFS同组内storage server数据是同步的, Storage server中由专门的线程根据binlog进行文件同步。为了最大程度地避免相互影响以及...
  • u010778803
  • u010778803
  • 2013年06月28日 12:54
  • 2846

【docker】初识docker

docker经过这么几年的发展,到如今更是火热到即使你没吃过猪也见过猪跑的地步,本节会给大家介绍docker的一些含义,让大家了解docker什么是DockerDocker是一个开放源代码软件项目,让...
  • qq_28602957
  • qq_28602957
  • 2016年12月21日 17:41
  • 1753
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:与网友讨论之初识同步
举报原因:
原因补充:

(最多只允许输入30个字)