java中的synchronized

1、synchronized为互斥。该关键词可以申明方法也可以申明代码库。

import java.util.concurrent.TimeUnit;

public class SynchronizedDemo1 {
	public synchronized static void synchronizedDemo(){

	    try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	    System.out.println("test1");
	}

	public static void test1(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}

	public static void test2(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}

	public static void main(String[] args) {
		SynchronizedDemo1 sd = new SynchronizedDemo1();
		sd.test1();
		SynchronizedDemo1 sd1 = new SynchronizedDemo1();
		sd1.test2();
	}
}

该类中main为一个线程,分别调用同一个方法。结果得到的互斥的效果,必须要等待前一个方法执行完毕,才能执行后面的调用。经过测试,只要是不同的线程,都会起到互斥的效果

2、下面再看一个例子没有static来修饰的,这里同一对象多个线程都能启动互斥的效果,如果是不同的对象就不能起到互斥的效果。

import java.util.concurrent.TimeUnit;

public class SynchronizedDemo2 {
	public synchronized void synchronizedDemo(){

	    try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	    System.out.println("test1");
	}

	public void test1(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}

	public void test2(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}

	public static void main(String[] args) {
		SynchronizedDemo2 sd = new SynchronizedDemo2();
		sd.test1();
		SynchronizedDemo2 sd1 = new SynchronizedDemo2();
		sd1.test2();
	}
}

3、将synchronized修饰在i代码块中。这里的效果和前面类似,只是将synchronized放在代码块中更加灵活。

public class SynchronizedDemo3 {
	public  void synchronizedDemo(){
		System.out.println("进入方法:1");
		synchronized(this) {
			try {
				TimeUnit.SECONDS.sleep(2);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("等待后:2");
		}

	    System.out.println("结束后:3");
	}

	public void test1(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}

	public void test2(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}

	public static void main(String[] args) {
		SynchronizedDemo3 sd = new SynchronizedDemo3();
		sd.test1();
		//SynchronizedDemo3 sd1 = new SynchronizedDemo3();
		sd.test2();
	}
}
<p>结果如下</p><p>进入方法:1</p><p>进入方法:1</p><p>等待后:2</p><p>结束后:3</p><p>等待后:2</p><p>结束后:3</p>
时间: 2024-10-13 02:06:17

java中的synchronized的相关文章

巨人大哥谈Java中的Synchronized关键字用法

巨人大哥谈Java中的Synchronized关键字用法 认识synchronized 对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方价格synchronized基本上就搞定 了,如果说不考虑性能问题的话,这一操绝对能应对百分之九十以上的情况,若对于性能方面有要求的话就需要额外的知识比如读写锁等等.本文目的先了解透彻synchronized的基本原理. Synchronized的基本使用 Synchronized的作用主要有三个: (1)确保线程互斥的访问同步代码 

对kotlin和java中的synchronized的浅谈

synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12345678910111213 public class { public void () { for (int i = 0; i < 10; i ++) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStac

关于Java中的synchronized关键字

[内容简介] 本文主要介绍Java中如何正确的使用synchronized关键字实现线程的互斥锁. [能力需求] 至少已经完整的掌握了Java的语法基础,基本的面向对象知识,及创建并启动线程. [正文] 关于synchronized关键字的使用,很多说法是“锁同一个对象”就可以确保锁是正常的,今天,有人提了一个问题,我觉得非常不错,所以与各位一起分享一下. 在这里,就不提关于线程和synchronized关键字的基本使用了,以非常传统的“银行取钱”的故事为案例,直接上代码:Ps:以下代码是直接敲

Java中利用synchronized关键字实现多线程同步问题

Java 中多线程的同步依靠的是对象锁机制,synchronized关键字就是利用了封装对象锁来实现对共享资源的互斥访问. 下面以一个简单例子来说明多线程同步问题,我们希望在run()方法里加入synchronized关键字来实现互斥访问. package com.clark.thread; public class MyThread implements Runnable{     private int threadId;          public MyThread(int id){

Java中的synchronized、volatile、ReenTrantLock、AtomicXXX

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 -- synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个

详细讲解 java 中的synchronized 转自 http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html

Java synchronized详解 第一篇: 使用synchronized 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语 --synchronized,这也大大简化了Java中多线程同步的使用.我们首先编写一个非常简单的多线程的程序,是模拟银行中的多个线程同时对同一 个储蓄账户进行存款.取款操作的.在程序中我们使用了一个简化版本的Account类,代表了一个银行账户的信息.在主程序中我们首先生成了 1000个线程,然后启动

java中的Synchronized 实现

1 引言 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程. 3 同步的基础 Java中的每一个对象都可以作为锁. 对于同步方法,锁是当前实例对象. 对于静态同步方法,锁是当前对象的Class对象. 对于同步方法块,锁是Synchoni

自顶向下彻底理解 Java 中的 Synchronized

阅读本文至少要知道 synchronized 用来是干什么的... 需要的前置知识还有 Java 对象头和 Java 字节码的部分知识. synchronized 的使用 synchronized 有三种使用方式,三种方式锁住的对象是不相同的. 锁分为实例对象锁和 class 对象锁 和 类对象锁,注意这三种锁是不一样的. 修饰实例方法,此时锁住的是对象,锁分为实例对象锁 修饰静态方法,此时锁住的是类对象锁 修饰代码段,此时锁住的是括号中的对象(synchronized(this)),可以是实例

谈谈java中的synchronized关键字

1.synchronized的3种用法 public class Client { public static void main(String[] args) { testSynchronized(); } private static void testSynchronized() { new Foo().sayHello(); } static class Foo { //修饰代码块 void sayHello() { synchronized (this) { System.out.pr

java中的synchronized关键字

参考:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html 多线程问题的根因: 多线程环境下,对一个对象更改的时候,一个线程A对某个变量做了改变,但是还没改变完成能,就被另外一个线程B抢去了cpu,那么A就不会再执行了,因此导致了数据不一致行为.针对上面引文中银行取款存款的例子,本来存一百取一百正好抵消,但是由于多线程的之间的肆意抢占,有些取存款的操作没有完成,自然导致结果千奇百怪. 关键点: synchronized