synchronized关键字实现同步

原创 2018年04月16日 00:15:43

Java语言提供了synchronized关键字,可以给方法或代码块进行加锁,从而实现同步。

synchronized关键字取的锁都是对象锁,而不是把代码块或方法当做锁。主要有以下几种场景:

(1) 同步化类的非静态方法,取的调用该方法的对象上的对象锁;

(2) 同步化类的静态方法,取的是类的Class对象上的对象锁;

(3) 同步化代码块,synchronized(obj){...},取的是obj上的对象锁;

(4) 同步化代码块,synchronized(this),取的是当前对象上的对象锁;

(5) 同步化代码块,synchronized(类名.class),取的是类的Class对象上的对象锁。

synchronized关键字拥有锁重入功能,也就是说在使用synchronized时,当一个线程得到对象锁后,它再次请求该对象锁也是可以再次取得的。因此,在一个同步化方法/块的内部调用本类的其他同步化方法/块,是永远可以得到锁的。

当一个线程执行的代码出现异常时,其所持有的锁会自动释放,一个示例如下:

public class Main {

	public static void main(String[] args) {
		Service s = new Service();
		Thread ta = new DispatcherThread("a", s);
		Thread tb = new DispatcherThread("b", s);
		ta.start();
		try {
			Thread.sleep(1000);
		} catch (Exception e) {
			e.printStackTrace();
		}
		tb.start();
	}

	public static class DispatcherThread extends Thread {

		Service service;

		public DispatcherThread(String name, Service service) {
			super(name);
			this.service = service;
		}

		@Override
		public void run() {
			service.f();
		}

	}

	public static class Service {
		public synchronized void f() {
			System.out.println(Thread.currentThread().getName() + " start to run.");
			g();
		}

		public synchronized void g() {
			if (Thread.currentThread().getName().equals("a")) {
				throw new RuntimeException();
			}
		}
	}

}
Exception in thread "a" a start to run.
java.lang.RuntimeException
	at com.huawei.nlz.multithread.Main$Service.g(Main.java:42)
	at com.huawei.nlz.multithread.Main$Service.f(Main.java:37)
	at com.huawei.nlz.multithread.Main$DispatcherThread.run(Main.java:29)
b start to run.

可以看到,在a抛出异常后,线程b顺利进入同步化方法中。

子类覆盖父类的同步方法时,需要手动指明同步性,否则则不会被同步化。

用String常量做同步锁时,要注意字符串的常量池特性。

只要锁对象不变,只改变锁对象的属性,对同步就不会有影响。


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nlznlz/article/details/79954560

Java线程同步中关键字synchronized简述

Java线程同步中关键字synchronized简述 一、作用: synchronized关键字通过修饰一个方法或者声明一个代码块,从而产生一个同步对象锁以及对应的同步代码块。每当...
  • beiyus
  • beiyus
  • 2015-10-14 13:40:49
  • 2075

java线程同步的三种方法[synchronized关键字,Lock加锁,信号量Semaphore]

java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题。java在处理线程同步时,常用方法有: 1、synchronized关键字。 2、Lock显示加锁。 3、信号量Semap...
  • zmx729618
  • zmx729618
  • 2017-04-01 15:10:17
  • 817

Java并发——线程同步Volatile与Synchronized详解

Java面试——线程同步volatile与synchronized详解 0. 前言面试时很可能遇到这样一个问题:使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现线程安全...
  • SEU_Calvin
  • SEU_Calvin
  • 2016-08-30 19:09:16
  • 18076

synchronized——java同步关键字

  每一个对象都有一把独占锁。独占锁只限制线程对它的同步方法的访问,对非同步方法,独占锁没有意义。  synchronized是java中解决同步问题的一个方法。synchronized可以用来修饰...
  • wongtseng
  • wongtseng
  • 2007-03-21 14:52:00
  • 8650

synchronized关键字的实现原理

在java语言规范中,synchronized的功能是通过monitor实现的, 什么是monitor? A monitor is mechanism to control concurren...
  • bwh12398
  • bwh12398
  • 2016-12-08 15:34:29
  • 154

synchronized关键字与Lock锁机制的区别问题

synchronized关键字与Lock锁机制的区别
  • a2279860a
  • a2279860a
  • 2017-01-19 16:22:07
  • 1366

Synchronized关键词使用场景解析

synchronized关键词使用场景解析Java synchronized 使用场景 修饰成员方法: public synchronized void memberMethod(){}; 修饰...
  • tear2210
  • tear2210
  • 2015-10-28 18:03:41
  • 1088

Java同步关键字Synchronized深入理解

题记讲讲写这篇博客的原因,因为自认为对synchronized这个关键字很了解了,前几天和一个刚好在找工作的朋友聊到了这个。结果他把面试遇到的一个问题给我出了出来,当我蒙圈的那一刻才懂得自己之前的了解...
  • gao36951
  • gao36951
  • 2017-10-28 15:18:53
  • 174

同步关键字synchronized

同步关键字synchronized 同步关键字synchronized使用简洁,代码可维护性好。在JDK6中,性能也比早期的JDK有很大的改进。如果可以满足程序要求,应该首先考虑这种同步方式。  ...
  • ycy258325
  • ycy258325
  • 2016-04-20 16:46:51
  • 266

Synchronized关键字详解

多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。   同步机制可以使用synchronized关键字实现。   当...
  • u010408365
  • u010408365
  • 2014-12-17 16:02:03
  • 2136
收藏助手
不良信息举报
您举报文章:synchronized关键字实现同步
举报原因:
原因补充:

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