(转)Java中synchronized关键字锁定的内容

news/2024/7/4 10:05:00

  synchronized关键字能锁定什么?通常我们锁定的是一个对象或者是一个代码块。其实synchronized还能锁定一些其他内容。

      同步分为 同步方法 和 同步块 两种方式。

      变量分为 实例变量(不带static的变量) 和 类变量(带static的变量)。

      同步锁锁定的内容是什么?

      无论你将Synchronized加在方法【非static,static的后面还会说】前还是加在一个变量【非static,static的后面还会说】前,其锁定的都是一个对象。 每一个对象都只有一个锁与之相关联。

      上面两种写法是一样的,都是锁定实例对象。

      下面的写法都是锁定类对象。在下面的例子中是锁定的Demo3这个类。

     【当锁定static变量的时候,由于static变量只有一份拷贝,所以此时锁定的也是类对象】

      在这种情况下,如果有一个线程thread 访问了这4个方法中的任何一个, 在同一时间内其它的线程都不能访问这4个方法。

      总结一下:

      synchronized可以修饰方法,可以修饰变量,方法和变量都可以是静态的【类方法类变量】,或者是非静态【实例方法实例变量】的。

-------------------------------------------------------------

      一个线程执行临界区代码过程如下:
      1 获得同步锁
      2 清空工作内存
      3 从主存拷贝变量副本到工作内存
      4 对这些变量计算
      5 将变量从工作内存写回到主存
      6 释放锁

 

 

 

REFS:http://blog.csdn.net/imzoer/article/details/8054151

 

http://www.niftyadmin.cn/n/4235274.html

相关文章

(转)解决Quartz定时任务被触发两次的问题

摘要: 解决quartz定时任务被触发两次的问题 方法1、通过改TOMCAT的配置文件server.xml配置 方法2、先把quartz配置信息提取出来,单独存成一个文件,比如applicationContext-quartz.xml 然后修改web.xml,让web容器启动时,可以加载该…

(转) Spring的quartz定时器同一时刻重复执行二次的问题解决{经测试不可用}

最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此。打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候,重复启了两个quartz线程…

(转)oracle常用函数一:数字函数

1,abs(n) 返回n的绝对值 [plain] view plaincopy SQL> select abs(-1),abs(1) from dual; ABS(-1) ABS(1) ---------- ---------- 1 1 2,ceil(n) 返回大于等于n的最小整数 [plain] view plaincopy SQL> select cei…

(转)上传文件思路

一看就是用了AJAX_UPLOAD,点图的时候就上传了吧.如果是这样的接下来你会需要:创建临时目录AJAX_UPLOAD至临时目录FORM提交时将临时目录文件mv至正式目录写个定时任务清理临时目录临时目录有很多方法,量不多的话日期目录最简单.任务清理前一天的任务临时目录的文件其实可以异步删…

Databing()的使用

我们先来看一个简单的例子&#xff1a; <% Page Language"C#" %> <% Import Namespace"System.Data" %> <Script Language"C#" Runat"Server"> public void Page_Load(Object src,EventArgs e) { //首先建立一…

【转】动态树

动态树是一种“超级数据结构”&#xff0c;它能够维护一个由若干有根树组成的森林&#xff0c;在对数的时间复杂度内支持&#xff1a; 1.查询一个点的父亲 2.查询一个点所在的树的根 3.修改某个节点的权 4.向从某个节点到它所在的树的根的路径上的所有的节点的权增加一个数 5.查…

(转)java之用volatile和不用volatile的区别

在当前的Java内存模型下&#xff0c;线程可以把变量保存在本地内存&#xff08;比如机器的寄存器&#xff09;中&#xff0c;而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值&#xff0c;而另外一个线程还继续使用它在寄存器中的变量值的拷贝&…