java synchronized的运用

这几天被线程弄晕了

特地恶补了一下java的线程知识

synchronized关键字是可以实现一个类对象同一时间只被一个线程调用,其他线程要调用这个对象只能等正在调用的线程结束或停止(一般会用在停止状态,如果是结束的话直接用join()方法会更方便)才能获得对象

synchronized使用方法一:锁定对象方法

动手写代码,写了一个模拟买票的场景:

先写一个Tickets类

class Tickets {
	public Tickets() {
		// TODO Auto-generated constructor stub
	}

	int total_tickets = 30;

	void sell_tickets(String thread_name) {
		synchronized (this) {
			total_tickets--;
			System.out.println(thread_name + " sell a ticket, remains "
					+ total_tickets);
		}
	}
}

设置一共有30张票,

 sell_tickets(String thread_name)

会将线程名和剩余张数打印出来,注意sell_tickets()里面用了synchronized(this),表示这段代码同一时间只能被一个线程调用

Thread counter1 = new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				for (int i = 0; i < 10; i++) {
					tickets.sell_tickets("1");
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
		Thread counter2 = new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				for (int i = 0; i < 10; i++) {
					tickets.sell_tickets("2");
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
		Thread counter3 = new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				for (int i = 0; i < 10; i++) {
					tickets.sell_tickets("3");
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
		counter1.start();
		counter2.start();
		counter3.start();

新建1个Tickets类对象,3个counter线程,每个线程每隔一段时间就卖1张票,在Thread.sleep的时候就会让别的等待线程获得tickets.sell_ticket的使用权

结果如下:

1 sell a ticket, remains 29
3 sell a ticket, remains 28
2 sell a ticket, remains 27
1 sell a ticket, remains 26
2 sell a ticket, remains 25
3 sell a ticket, remains 24
2 sell a ticket, remains 23
1 sell a ticket, remains 22
3 sell a ticket, remains 21
2 sell a ticket, remains 20
1 sell a ticket, remains 19
3 sell a ticket, remains 18
2 sell a ticket, remains 17
1 sell a ticket, remains 16
3 sell a ticket, remains 15
2 sell a ticket, remains 14
3 sell a ticket, remains 13
1 sell a ticket, remains 12
2 sell a ticket, remains 11
3 sell a ticket, remains 10
1 sell a ticket, remains 9
2 sell a ticket, remains 8
1 sell a ticket, remains 7
3 sell a ticket, remains 6
2 sell a ticket, remains 5
1 sell a ticket, remains 4
3 sell a ticket, remains 3
2 sell a ticket, remains 2
3 sell a ticket, remains 1
1 sell a ticket, remains 0

可以看到,三个线程调用tickets对象并没有发生冲突

synchronized使用方法二:线程中锁定对象

这一次我们并不锁定Tickets类方法

只做一般的定义

class Tickets {
	public Tickets() {
		// TODO Auto-generated constructor stub
	}

	int total_tickets = 30;

	void sell_tickets(String thread_name) {
			total_tickets--;
			System.out.println(thread_name + " sell a ticket, remains "
					+ total_tickets);
	}
}

但我们在线程的runnable中使用synchronized将tickets对象同步

Thread counter1 = new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				for (int i = 0; i < 10; i++) {
					synchronized (tickets) {
						tickets.sell_tickets("1");
					}
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});

同样能实现同步的效果

时间: 2024-10-08 01:32:35

java synchronized的运用的相关文章

Java synchronized 总结

在Java开发的时候经常会用到关键字synchronized来对代码进行同步,在使用的过程中,对于synchronized确不是很熟悉,最近在看Spring源码时,发现有不少地方都用到同步,因此,趁此机会,研究一下. 1. synchronized锁的对象 Java中的每一个对象都可以作为锁. 1)对于同步方法,锁是当前实例对象. 2)对于静态同步方法,锁是当前对象的Class对象.因为在Java 虚拟机中一个类只能对应一个类对象,所以同时只允许一个线程执行同一个类中的静态同步方法. 3)对于同

Java synchronized详解

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

java synchronized

synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块.  1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法.如:  public synchronized void accessVal(int newVal);  synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方

java synchronized使用

java synchronized 基本上,所有并发的模式在解决线程冲突问题的时候,都是采用序列化共享资源的方案.这意味着在给定时刻只允许一个任务访问该资源.这个一般通过在代码上加一条锁语句实现,因为锁语句产生一种互斥排斥的效果,这种机制常常被称为互斥机制. 线程是簇拥在共享资源门前,并不是排队进入,可以通过yield()和setPriority()来给线程调度提供建议,但这些建议未必会有多大的效果.这取决与你的具体平台和vm的实现:)--//from <think in java> java

java synchronized wait

在多个线程要互斥访问数据,但线程间需要同步时——例如任务分多个阶段,特定线程负责特定阶段的情况,经常合作使用synchronized 和 wait() /** * * 计算输出其他线程锁计算的数据 * @author * */ public class Main { public static void main(String[] args) { ThreadB b = new ThreadB(); b.start();// 启动计算线程 synchronized (b) { try { Sys

Java Synchronized 与 ThreadLocal 异同

同:都是为了线程安全 异:synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问.而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象, 这样就隔离了多个线程对数据的数据共享.而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享.Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的 数据隔离.当然ThreadLocal并不能替代synchronized,它们处理

java synchronized(一)

java synchronized主要用于控制线程同步,中间有很多小的细节,知识,这里我简单的整理一下,做个记录.主要用于方法和代码块的控制 先说说方法控制 模拟银行存款和取款,创建一个Account类,两个属性,一个name和accout.先存1w进去,在用一100个线程取钱1k和存1k.等待所有线程结束后,输出account.没有synchronized控制会造成account不等于1w.使用了synchronized结果正确,性能降低了很多.下面贴一下代码 参考:http://www.cn

Java Synchronized 关键字

本文内容 Synchronized 关键字 示例 Synchronized 方法 内部锁(Intrinsic Locks)和 Synchronization 参考资料 下载 Demo Synchronized 关键字 Java 语言提供两个基本的同步机制:synchronized 方法(synchronized methods )和 synchronized  语句(synchronized statements). 示例 先大概说一下 Java Synchronized 关键字,当它用来修饰一

Java Synchronized Blocks

From http://tutorials.jenkov.com/java-concurrency/synchronized.html By Jakob Jenkov Table of Contents The Java synchronized Keyword Synchronized Instance Methods Synchronized Static Methods Synchronized Blocks in Instance Methods Synchronized Blocks

Java synchronized 关键字详解

Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 synchronized public void sync(){ } 修饰静态成员方法 synchronized public static void sync(){ } 类锁代码块 synchronized (类.class){ } 对象锁代码块 synchronized (this|对象){ } syn