对多线程的锁的理解

package com.huowolf;

/*
 * 有必要加锁的前提是:有多个线程对同一数据进行多行代码操作。
 * 检查方法是,1.先找出多个线程执行了那些代码块。
 * 2.这些代码中有没有共同(或共享)数据。
 * 3.操作该共同数据的代码是否有多行。
 * 如果以上三条都满足的话。则必须要加锁(也就是同步代码块或者同步函数)。
 *
 *
 * 同步函数用的哪一个锁?
 * 函数需要被对象调用,那么函数都有一个所属对象引用,就是this.
 * 所以同步函数使用的锁是this
 *
 * 同步函数被静态修饰后,使用的锁是什么那?
 * 使用静态方式,内存中没有本类对象,但是一定有该类对应的字节码文件对象
 * 类名.class  该对象的类型是Class
 * 静态的同步方法,使用的锁是该方法所在类的字节码文件对象。即 类名.class
 */

class Ticket implements Runnable {
	private int ticket =100;
	boolean flag =true;

	@Override
	public void run() {

		if(flag) {
				 while(true) {
						 //同步代码块
						 synchronized (this) {
							 if(ticket>0) {
								try {Thread.sleep(10); } catch (Exception e) {}
								System.out.println(Thread.currentThread().getName()+"代码块..."+ticket--);
							 }
						 }
				 }
		}
		 else{
			 while(true){ 	show();}
		 }

	}

	//同步函数
	public synchronized void show() {
			if(ticket>0) {
				try {
					Thread.sleep(10);
				} catch (Exception e) {}
				System.out.println(Thread.currentThread().getName()+"函数..."+ticket--);
			}
}

}

public class ThisLockDemo {

	public static void main(String[] args) {
			Ticket t = new Ticket();

			Thread t1 = new Thread(t);
			Thread t2 = new Thread(t);
			t1.start();
			//让主线程睡眠一小会,让t1线程先执行
			try {Thread.sleep(10); } catch (Exception e) {}
			t.flag = false;
			t2.start();

	}

}

时间: 2024-11-05 08:46:36

对多线程的锁的理解的相关文章

Java多线程同步锁的理解

ava 多线程中同步锁的主要通过synchronized的关键字来实现的.让我们从一个买票程序说起吧. package com.day04; /** * * @author Administrator 问题描述:使用多线程的方式来模拟多个窗口买票 * */ public class SaleWindow implements Runnable { // 初始化票数10 private int ticket = 10; @Override public void run() { // 获取线程的名

对JAVA多线程 并发编程的理解

对JAVA多线程并发编程的理解 Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结. 线程状态转换 Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是: ?  新建(New):创建后尚未启动的线程处于这种状态 ?  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可

【转】Linux平台上用C++实现多线程互斥锁

原作者:chexlong 原文地址:http://blog.csdn.net/chexlong/article/details/7058283 在上篇用C++实现了Win32平台上的多线程互斥锁,这次写个Linux平台上的,同样参考了开源项目C++ Sockets的代码,在此对这些给开源项目做出贡献的斗士们表示感谢! 下边分别是互斥锁类和测试代码,已经在Fedora 13虚拟机上测试通过. Lock.h [cpp] view plaincopy #ifndef _Lock_H #define _

Object-C 多线程中锁的使用-NSLock

在多线程的编程环境中,锁的使用必不可少! 于是,今天来总结一下为共享资源加锁的操作方法. 一.使用synchronized方式 //线程1 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @synchronized (_myLockObj){ [obj1 method1]; sleep(30); } @synchronized (obj1){ } }); //线程2 dispatch

iOS多线程同步锁

在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法)会自动对参数对象加锁,保证临界区内的代码线程安全 [cpp] view plaincopyprint? @synchronized(self) { // 这段代码对其他 @synchronized(self) 都是互斥的 // self 指向同一个对象 } 方法二,NSLockNSLock对象实现了NSLocking protocol,包含几个方法:l

python:线程,多线程锁,多线程递归锁

#!usr/bin/env python# -*- coding:utf-8 -*- __author__ = "Samson" import threading,timedef run(n): print("task", n) time.sleep(2) print("current thread:",threading.current_thread())#当前线程 t_obj = []#存线程实例start_time = time.time(

Java多线程并发编程/锁的理解

一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等方案后,问题得到解决. 限流方案见本人另一篇博客:Guava-RateLimiter实现令牌桶限流 二.乐观锁 & 悲观锁 1.乐观锁   顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号(versio

soa---java 多线程的---锁

如今soa 与分布式计算已经成为互联网公司技术的标配 那他包括的知识点应该熟悉了解.并以此为基础,去应用,调优各种soa的框架. 包括例如以下的四点.是分布式的基础.         a java 多线程 承接高吞吐量.         b java nio 承接高并发,与交互协议的定制.         c java 反射  完毕序列化与反序列化.         d 设计模式的应用 保证应用的扩展性. 接上篇 由于说锁的原理比較的枯燥,得带着问题场景去说.才干看下去.才干研究下去. 在Jav

C# 多线程并发锁模式-总结

开篇: 互斥还是lock Monitor Mutex 模式! Muex Monitor lock AutoEventSet ManualEventSet 后续的 ReaderWriterLock ReaderWriterLockSlim 类 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问. 使用 ReaderWriterLockSlim 来保护由多个线程读取但每次只采用一个线程写入的资源. ReaderWriterLockSlim 允许多个线程均处于读取模式,允许一个线程处