26 多线程(六)——线程安全 synchronized

关键字synchronized可以写在方法和代码块中

  • 写在普通方法中:锁住的对象时this
  • 写在静态方法中:锁住的对象时class
  • 写在代码块中

关于这个synchronized关键字

  • 线程锁会造成性能下降
  • 线程锁用在大的方法中,很影响性能

关于线程锁

  • 除了使用synchronized关键字外,还可以使用另一种线程锁,本文没有收录方法

下面来看一个没有加线程锁的案例:3个线程抢票

package _20191205;
/**
 * 线程不安全:
 * @author TEDU
 */
public class SynTest01 {
	public static void main(String[] args) {
		//一份资源
		SafeWeb12306 web = new SafeWeb12306();
		new Thread(web,"线程1").start();
		new Thread(web,"线程2").start();
		new Thread(web,"线程3").start();
	}
}

class SafeWeb12306 implements Runnable{
	//票数
	private int ticketNums = 100;
	private boolean flag = true;

	@Override
	public void run() {
		while(flag) {
			try{
				Thread.sleep(100);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			buy();
		}
	}

	//买票:线程不安全
	public void buy() {
		if(ticketNums<=0) {
			flag = false;
			return;
		}
		try {
			Thread.sleep(100);
		}catch(InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
	}
}

  

它的运行结果:

会出现多个线程抢了同一张票的情况,为了避免这种情况,我们需要给关键方法加锁,在本例中,我们只需要给buy()方法加锁即可,即:

public void synchronized buy(){...}

  

原文地址:https://www.cnblogs.com/Scorpicat/p/11988453.html

时间: 2024-10-11 07:13:42

26 多线程(六)——线程安全 synchronized的相关文章

多线程(六)线程间的通信和协作

系统要实现某个全局功能必定要需要各个子模块之间的协调和配合,就像一个团队要完成某项任务的时候需要团队各个成员之间密切配合一样.而对于系统中的各个子线程来说,如果要完成一个系统功能,同样需要各个线程的配合,这样就少不了线程之间的通信与协作.常见的线程之间通信方式有如下几种: 1.wait和notify/notifyAll  2.await和signal/signalAll   3.sleep/yield/join  4.CyclicBarrier 栅栏  5.CountDownLatch 闭锁  

多线程 Thread 线程同步 synchronized

1.多线程基础以及两种启用方式 /** * 多线程 * 多线程改变了代码的执行方式,从原有的所有代码都串行操作改变为多个代码片段之间并行操作. * 因此多线程允许多个代码片段"同时运行". * * 创建线程的方式有两种 * 1:继承线程并重写run方法,在run方法中定义线程要执行的任务. */ public class ThreadDemo1 { public static void main(String[] args) { Thread t1 = new MyThread1();

C#多线程之线程池篇3

在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关知识. 五.使用等待句柄和超时 在这一小节中,我们将学习如何在线程池中实现超时和正确地实现等待.具体操作步骤如下: 1.使用Visual Studio 2015创建一个新的控制台应用程序. 2.双击打开"Program.cs"文件,编写代码如下所示: 1 using System; 2 u

iOS开发多线程篇—线程安全 - 文顶顶

原文  http://www.cnblogs.com/wendingding/p/3805841.html iOS开发多线程篇—线程安全 一.多线程的安全隐患 资源共享 1 块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 示例一: 示例二: 问题代码: 1 // 2 // YYViewController.m 3 // 05-线程安全 4 // 5 // Create

java多线程之线程的同步与锁定(转)

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. publicclass Foo { privateint x = 100; publicint getX() { return x;     } publicint fix(int y) {         x = x - y; return x;     } } publicclass MyRunnable i

多线程及线程池学习心得

一.线程的应用与特点 多线程是程序员不可或缺的技术能力,多线程技术在各个方面都有应用,特别在性能优化上更是起到至关重要的作用.但是,如果多线程写得不好,往往会适得其反,特别是高并发时会造成阻塞.超时等现象.多线程具有以下特点:1.独立性,拥有自己独立的资源,拥有自己私有的地址空间:2.动态性,进程具有自己的生命周期和各种不同的状态:3.并发性,多个进程可以在单个处理器上并发执行,不会相互影响,并行是指同一时刻有多条指令在多个处理器上同时执行.线程是进程的组成部分,一个进程可以拥有多个线程,一个线

iOS开发多线程篇—线程安全

iOS开发多线程篇—线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 示例一: 示例二: 问题代码: 1 // 2 // YYViewController.m 3 // 05-线程安全 4 // 5 // Created by apple on 14-6-23. 6 // Copyright (c) 2014年 itcase.

JAVA多线程之线程间的通信方式

一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. 参考示例: public class MyObject { synchronized public void methodA() { //do something.... } synchronized public void methodB()

OS开发多线程篇—线程间的通信

iosblog's iOS开发多线程篇—线程间的通信 Cocoa为iOS线程间通信提供2种方式,1种是performSelector,另1种是Port. 先说第1种,performSelector,有以下几种: 第2种为NSMachPort方式.NSPort有3个子类,NSSocketPort.NSMessagePort.NSMachPort,但在iOS下只有NSMachPort可用. 使用的方式为接收线程中注册NSMachPort,在另外的线程中使用此port发送消息,则被注册线程会收到相应消

关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文)

Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享给大家. 一.对于线程同步和同步锁的理解(注:分享了三篇高质量的博客) 以下我精心的挑选了几篇博文,分别是关于对线程同步的理解和如何选择线程锁以及了解线程锁的作用范围. <一>线程同步锁的选择 1. 这里我推荐下Java代码质量改进之:同步对象的选择这篇博文. 2. 以上推荐的博文是以卖火车票为例