synchronized 修饰在 static方法和非static方法的区别

  Java中synchronized用在静态方法和非静态方法上面的区别

  在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到底有什么不同呢?大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,是属于类的锁。而非static方法获取到的锁,是属于当前对象的锁。所以,他们之间不会产生互斥。

  看代码:

public class Demo {
	public static synchronized void staticFunction()
			throws InterruptedException {
		for (int i = 0; i < 3; i++) {
			Thread.sleep(1000);
			System.out.println("Static function running...");
		}
	}

	public synchronized void function() throws InterruptedException {
		for (int i = 0; i <3; i++) {
			Thread.sleep(1000);
			System.out.println("function running...");
		}
	}

	public static void main(String[] args) {
		final Demo demo = new Demo();
		Thread thread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					staticFunction();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});

		Thread thread2 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					demo.function();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});

		thread1.start();
		thread2.start();
	}
}

  运行结果是:

function running...
Static function running...
function running...
Static function running...
function running...
Static function running...

  那当我们想让所有这个类下面的方法都同步的时候,也就是让所有这个类下面的静态方法和非静态方法共用同一把锁的时候,我们如何办呢?此时我们可以使用Lock。

时间: 2024-10-14 02:03:10

synchronized 修饰在 static方法和非static方法的区别的相关文章

java——多线程——单例模式的static方法和非static方法是否是线程安全的?

单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static方法不是线程安全的,那么不会因为这个类使用了单例模式,而变的安全. 闲话休说,看代码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestSingl

static方法和非static方法的区别

●生命周期(Lifecycle):静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭.非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用.不会常驻内存,当实例对象被JVM 回收之后,也跟着消失. ● 在内存中存储位置静态方法和静态变量创建后始终使用同一块内存,是连续的.非静态方法会存在于内存的多个地方,是离散的.

【Java学习笔记】static方法和非static方法的区别

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法.被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.静态方法可以直接通过类名调用,任何的实例也都可以调用.因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法. 因此以下代码中,func_static方法只能访问num2成员,而func方法可以同

java static成员变量方法和非static成员变量方法的区别

这里的普通方法和成员变量是指,非静态方法和非静态成员变量首先static是静态的意思,是修饰符,可以被用来修饰变量或者方法. static成员变量有全局变量的作用       非static成员变量则没有全局变量的作用        局部变量是类的方法里面的变量静态static成员变量是指类的成员变量,他不属于类的对象,只单独属于类,被所有对象共享.当在类中改变他的值时,他在每个对象里面的值都会随之改变. 这也就是说在对象中不能改变他的值,只能在他所在的类中改变,如果他带有final的话(sta

length属性、length()方法和size()的方法的区别

JAVA 1. length属性是针对Java中的数组来说的,要求数组的长度可以用其length属性: 2.length()方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法: 3. java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看 public static void main(String[] args) { String[] list = {"bo", "ke", "yuan&

RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别

RequestDispatcher.forward()是服务器端跳转  response.sendRedirect()是客户端跳转 服务器端跳转的话,你的浏览器上的URL是不会改变的,比如你请求的是一个LoginServlet,要登入到main.jsp,这样的话,你的浏览器的url还是LoginServlet, 而客户端跳转的话,你的URL会是你要跳转去的页面地址:main.jsp: 服务器端跳转,同用一个request,而客户端跳转则不能共用一个request.

Html.Partial方法和Html.RenderPartial方法

分布视图 PartialView 一般是功能相对独立的,类似用户控件的视图代码片段,可以被多个视图引用,引用方式如下. 1,Html.Partial方法和Html.RenderPartial方法 静态类System.Web.Mvc.Html.PartialExtensions,利用扩展方法,扩展了System.Web.Mvc.HtmlHelper,因此有了Html.Partial方法,方法返回值为MvcHtmlString 静态类System.Web.Mvc.Html.RenderPartial

Server.Transfer方法,Server.Execute方法和Response.Redirect方法有什么异同

(1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页面转向到m2.aspx, 并将转向前数据加上m2.aspx页结果返回给浏览器,注意的是浏览器的地址没发生变化还是m1.aspx, (2)Server.Execute方法: Server.Execute("m2.aspx"); 服务器保存此页转向前的数据后,使页面转向到m2.aspx执行, 

jQuery hover()方法和jQuery toggle()方法用法示例

jQuery hover()方法和jQuery toggle()方法是两个合成事件,类似ready()方法,都属于jQuery自定义的方法.下面来讲解这两个方法的属性和如何使用. 一.hover()方法:语法结构为: hover(enter,leave).用于模拟光标悬停事件.当光标移动到目标元素上时,会触发指定第1个函数(enter);当移出这个元素时,会触发第2个函数(leave). 下面是一段示例代码: $(function(){ $("#panel h5.head").hove