synchronsized修饰方法的使用

线程同步是指对共享资源,若不是共享资源则不涉及线程同步问题。

synchronized方法可以锁定对象,也可以锁定代码块。

当锁定对象时,修饰在类的方法前面。记住:若两个线程同时访问一个对象的不同方法,且对象有一个synchronized方法和一个非synchronized方法,则是两个线程并不涉及同步问题。只有当访问同一个对象的synchronsized方法(可以是不同的synchronized方法)时才会有同步。

比如对象toy有如下两个方法

package concurrent1;

public class toy {
	private int number;
	public toy(){
		number = 100;
	}
	synchronized public void paint()
    {
		System.out.println("thread:"+Thread.currentThread().getName() + ":paint begin");
		try{
			int i = (int) (Math.random()*1000);
		Thread.sleep(i);
		}
		catch(Exception e)
		{

		}
        System.out.println("thread:"+Thread.currentThread().getName()+":paint");
        System.out.println("thread:"+Thread.currentThread().getName() + ":paint end");
    }
	synchronized public void write()
    {
		System.out.println("thread:"+Thread.currentThread().getName() + ":write begin");
		try{
			int i = (int) (Math.random()*1000);
		Thread.sleep(i);
		}
		catch(Exception e)
		{

		}
        System.out.println("thread:"+Thread.currentThread().getName()+":write");
        System.out.println("thread:"+Thread.currentThread().getName() + ":write end");
    }
}
package concurrent1;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		toy mytoy = new toy();
		boy myboy = new boy(mytoy);
		boy youboy = new boy(mytoy);
		myboy.setName("myboy");
		youboy.setName("youboy");
		myboy.start();
		youboy.start();
	}

}

结果:

thread:myboy:write begin
thread:myboy:write
thread:myboy:write end
thread:myboy:paint begin
thread:myboy:paint
thread:myboy:paint end
thread:youboy:write begin
thread:youboy:write
thread:youboy:write end
thread:youboy:paint begin
thread:youboy:paint
thread:youboy:paint end

若将paint方法前的synchronized取消掉,输出如下,可以看出write方法是异步执行的,只有paint方法是同步执行的。

thread:myboy:write begin
thread:youboy:write begin
thread:myboy:write
thread:myboy:write end
thread:myboy:paint begin
thread:myboy:paint
thread:myboy:paint end
thread:youboy:write
thread:youboy:write end
thread:youboy:paint begin
thread:youboy:paint
thread:youboy:paint end
时间: 2024-10-28 21:54:57

synchronsized修饰方法的使用的相关文章

JAVA 同步之 synchronized 修饰方法

在JAVA多线程编程中,将需要并发执行的代码放在Thread类的run方法里面,然后创建多个Thread类的对象,调用start()方法,线程启动执行. 当某段代码需要互斥时,可以用 synchronized 关键字修饰,这里讨论 synchronized 关键字修饰方法时,是如何互斥的. synchronized 修饰方法时锁定的是调用该方法的对象.它并不能使调用该方法的多个对象在执行顺序上互斥. 下面举个具体的例子说明: Test.java 通过 implements Runnable 成为

synchronized修饰方法和对象的区别

使用synchronized(object) { 代码块.... } 能对代码块进行加锁,不允许其他线程访问,其的作用原理是:在object内有一个变量,当有线程进入时,判断是否为0,如果为0,表示可进入执行该段代码,同时将该变量设置为1,这时其他线程就不能进入:当执行完这段代码时,再将变量设置为0. 想保证代码块在任务情况下都同步,即代码块在程序的中同一时刻只被一个线程调用,即需要使用synchronized( static object). object必须是静态变量,否则不同对象调用该方法

static 修饰方法

查阅资料的时候突发了对static修饰方法的思考.设计方法时在怎样的情况下会用static来修饰呢? 抛去加载和生存周期的考虑,当一个类的方法,它独立于该类的任何对象(该方法与对象的状态无关).通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例.

synchronized(修饰方法和代码块)

synchronized(修饰方法和代码块) 1. 含义 synchronized 是同步锁,用来实现互斥同步. 在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作). synchronized 还可以保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代 volatile 功能,但是 volatile 更轻量,还是要分场景使用). 2. 用法 synchr

springmvc之RequestMapping注解既可以修饰类也可以修饰方法

@RequestMapping不仅可以修饰类,也可以修饰方法. 总而言之,用@RequestMapping标识的是请求的URL地址.例如: package com.gong.springmvc.handlers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @RequestMapping("/springmvc&qu

不能与abstruct共同修饰方法的关键字

一 抽象类:动态方法至少有一个是抽象方法. 其中abstruct关键字修饰的方法不能与哪些关键字共同修饰? 1private 因为private修饰的方法在子类中是隐藏的.不可见的.而abstruct修饰的方法是抽象的,需要在子类中实现方法体.因此相互冲突,不可共同使用. 2 static 因为static表示该方法是类方法,在内存中只有一份,而abstruct表示的是动态方法,与对象绑定.所以有冲突,不可行. 3 final 因为final方法表示的是不可变方法,即不可以在子类中修改的方法.与

abstract修饰方法总结

abstract这种方法修饰,主要用在抽象类和抽象方法. 抽象的类是不可实例化的比如 public abstract class Test{ } 他能够含有抽象的方法 public abstract class Test{ public abstract void defMethod(); } 抽象的方法是要让子类继承下去再定义它的,让抽象的概念得以设计.比如当一种面向对象设计遇到一种方法有多种设计的时候,能够在基类暂且不设计他,把设计的工作交给子类去完毕,但子类设计时,要么继续继承他超类的抽象

java中什么时候该用static修饰方法?有什么好处或者坏处?

当一个方法或者变量需要初始化加载,或者是经常被调用的时候可以加上static.用static修饰的方法可以用类名直接调用,不用的一定要先实例化一个对象然后才可以调用比如 person这个类里面有一个方法public static add(){}那么可以直接用person类调用 person.add();当然也可以用下面的方法先出一个对象在调用也是可以如果这个方法前面没有static 比如 public add(){}那么先要person p=new person();然后用p.add();类加载

java中final修饰方法传入参数的影响

最近在看spring 源码深度解析 看到了许多方法中的参数被final修饰符修饰 什么作用自己蒙了 难道在方法中不允许修改参数么 网上查了查 恍然大悟 final类型修饰的参数分为两种类型 基本类型 与引用类型 final修饰基本类型如下 <span style="white-space:pre"> </span>public void getValue(final int a){ <span style="white-space:pre&quo