线程共享数据的安全问题



加同步代码:加了同步代码后,线程进同步判断锁,获取锁,出同步释放锁,导致了线程运行速度的下降

方式一:同步代码块

  解决线程安全问题,java程序提供了线程同步技术

  synchronized(任意对象){

    线程要操作的共享数据

  }

任意对象:通俗来讲叫同步锁或者对象监视器

同步的作用:保证线程的安全性,没有锁的线程是不能执行的,只能等待带锁的线程执行完拿到同步锁才能进入同步代码块中执行。

举个例子:

  现在有3个线程需要进入代码块中执行,当 线程1 遇到synchronized以后,线程1 会去判断同步锁还有没有,同步锁如果有,线程1把锁带走进入同步代码块中执行操作,执行完以后,线程1 离开同步代码块,就把锁还回去了(释放锁)。

  假如线程1进入同步代码块中的时候睡着了,此时 线程2 执行了,但是 线程2 在遇到 synchronized 时,去判断同步锁还在不在,此时的同步锁在线程1手上,线程2 拿不到同步锁,没有进入同步代码块的钥匙了,就不能进去同步中执行,被阻挡在同步代码块的外面,只有等 线程1 醒过来把同步锁还给 synchronized 了,此时 线程2 才有机会拿到钥匙(=锁)进入同步代码块中执行操作。

------------------------------------------------------------------------------------------- ---------------------------------------------

方法二:同步方法

  1.非静态方法

  采用同步方法形式,解决线程安全问题。

  好处:代码简洁

  用法:将线程共享数据,抽取到一个方法中,在方法的声明上加入同步关键字 synchronized

  同步方法中的对象锁是本类的对象引用 this。

  2.静态方法

  静态方法也有同步锁,同步锁是本类自己.class

----------------------------------------------------------------------------------------------------------------

原文地址:https://www.cnblogs.com/chenwei-blog/p/9545396.html

时间: 2024-08-29 18:28:31

线程共享数据的安全问题的相关文章

多线程06-多线程共享数据的方式(经验小结)

1.案例分析-01 通过代码实现火车票出售的例子 在实现代码之前先对问题进行分析:火车票出售应该是在多个窗口进行的(即多个线程),以一个车的班次来说,该班次的火车票张数即为多个窗口共享的数据 即这份共享数据为出售特定班次的火车票,这个动作在多个窗口都是不变的,变更的只有火车票的剩余张数.代码实现如下: package org.lkl.thead; /** * * Function : 多线程共享数据 * * @author : Liaokailin CreateDate : 2014-6-13

管理线程共享数据

方法1: 将共享数据封装在一个类的对象中,然后将这个对象传递给各个 Runnable对象 每个线程对共享数据的操作方法也分配到相应的对象身上去完成 示例代码: 1 public class Test { 2 private static ThreadLocal<MyThreadScopeData> myThreadScopeData = new ThreadLocal<MyThreadScopeData>(); 3 public static void main(String[]

有关多线程与线程共享数据的简单实现

首先讨论一下一个简单直接的问题,为什么要学多线程? 那么原因很简单,会了多线程,你就能涨工资或者找到更好的工作啊!!! 开个玩笑. 好吧,其实不怎么好笑. 多线程能解决什么问题? 举个例子,现在有两个任务A,B在同时进行,A需要10s,B需要2s.没有多线程之前,通常的做法无非两种,先执行A再执行B,或者先执行B再执行A,时间上的结果都是需要12s.那么有没有可能,A和B同时进行呢?有的!用多线程来实现.这个时候,AB任务的完成时间就是10s,节约了2s. 接下来要讲实现了. 讲实现之前,区分一

JAVA笔记14__多线程共享数据(同步)/ 线程死锁 /

/** * 多线程共享数据 * 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行. * 多线程共享数据的安全问题,使用同步解决. * 线程同步两种方法: * 1.同步代码块 * synchronized(要同步的对象){ 要同步的操作 } * 2.同步方法 * public synchronized void method(){ 要同步的操作 } */ public class Main { public static void main(

多线程共享数据

线程间的数据共享 多个线程共享数据, A线程生产物品,产品数量增加,B线程使用,那么产品数量减少,B线程如何知道产品buf是否为空呢?A线程如何判断产品buf为满?1 轮询机制      线程每隔一定时间检查缓冲区,如果有产品就取出,这种机制需要控制好轮询间隔,查询太频繁会导致占用cpu过多,浪费:查询太不频繁导致缓冲区满,生产者放不进去产品  int buf[MAX];  int ProductionCount;  while(1)  {  Msleep(100);     if(Produc

ThreadLocal实现:java线程范围内的共享数据,线程外独立

场景应用:银行转账时,A给B转账,C给D转账.两者都是调用的connection.begainTransaction();connection.commit(); 如何才能保证A,B同在一个线程中,C.D同在一个线程中,且A,BC,D在线程内共享,在线程外独立. 方法一,Map<Thread, Integer>实现: /** * 线程范围内的共享数据 */ package cn.itcast.lesson5; import java.util.HashMap; import java.util

线程间共享数据的一个例子

[申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:[email protected]] 题目:输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 题目分析: 一.如果数组中全部为负数,则返回最大负数值即可 二.当既有正数也有负数的时候: (1)从左往右叠加,如果当前叠加值小于或者等于0,则放弃,叠加总和清0(加一个负数或者0是毫无意义的),从此位置继续重新叠加 (

详解 Qt 线程间共享数据(用信号槽方式)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

Java多个线程之间处理共享数据的方式

题目要求: 有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现? 分析: x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到"窗口买票问题",但是卖票只是单纯的减. 所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题. 如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之