关于解决 共享资源竞争

共享资源一般是以对象的形式存在的内存片段,但也可能是文件,输入\输出端口,或者打印机。要控制对共享资源的访问,的先把它包装进一个对象。然后把所有要访问这个资源的方法标记为synchronized。如果某个人物处于一个对标记为synchronized的方法的调用中,那么在这个线程从该方法返回前,其他所有要调用类中任何标记为synchronized方法的线程都会被阻塞。

//中间这段为个人简单总结:

一个共享对象中所有标记为synchronzied的方法共享一个锁。一个线程可以多次获取对象的锁,比如:一个对象在同一个对象上的其他标记为synchronzied方法,后者又调用了同一个对象上的另一个方法。

注意:在使用并发时,将域设置为private是非常重要的,否则,synchronzied关键字就不能防止其他线程直接访问域,这样就会产生冲突。(现在终于有所体会,之前一直不明白为何要这么做。)

//总结结束

什么时候应该用同步呢? 可以使用Brian的同步规则:

如果你正在写一个变量,它可能接下来将会被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你必须使用同步,并且,读写线程都必须用相同的监视器同步。

上原文(照片喳喳的):

认识能够反应实践,同时也能够指导实践,正确的认识能够积极的推动实践的发展。

时间: 2024-10-10 09:22:42

关于解决 共享资源竞争的相关文章

【JAVA并发】共享资源访问

什么是共享资源 先了解下JAVA程序在运行时内存的分布,由以下部分组成 堆:所有线程共享一个堆:存放的都是new 出来的对象: 方法区:所有线程共享一个方法区:里面存放的内容有点杂,可以认为是除堆和栈中的其它东西(如类信息,静态变量,常量,代码等): 程序计数器:也叫PC,存放下一条指令所在单元的地址的地方; JAVA栈:每个线程都有一个自己的JAVA栈;存放的一般是方法的局部变量,方法出口信息等: 本地方法栈:与JAVA栈类似,区别是使用的对象不一样,本地方法栈是给Native方法使用的,JA

Go语言之并发资源竞争

并发本身并不复杂,但是因为有了资源竞争的问题,就使得我们开发出好的并发程序变得复杂起来,因为会引起很多莫名其妙的问题. package main import (     "fmt"     "runtime"     "sync" ) var (     count int32     wg    sync.WaitGroup ) func main() {     wg.Add(2)     go incCount()     go incC

java线程共享受限资源 解决资源竞争 thinking in java4 21.3

java线程共享受限资源 解决资源竞争  详细介绍请参阅:thinking in java4 21.3 thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.thread.res; /** * 不正确的访问 资源 * @author lenovo * */ public abstract class IntGenerator { private volatile bo

解决 samba不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接

参考:http://blog.chinaunix.net/u/19637/showart_491257.html怎么解决呢? 事实上这个不是samba的限制.是Windows的限制.始终要用public=yes的话,上面的方法都不能有效解决,因为:在打开存在public=yes的samba服务器时,如果首先点击了有public=yes的共享资源的时候,widows会用默认的用户名去连接服务器,一般就是windows的登录名(可以在服务器端查看到的),这时候,再去点击没有public=yes的共享

多线程下解决资源竞争的7种方法

前言 一般情况下,只要涉及到多线程编程,程序的复杂性就会显著上升,性能显著下降,BUG出现的概率大大提升. 多线程编程本意是将一段程序并行运行,提升数据处理能力,但是由于大部分情况下都涉及到共有资源的竞争,所以修改资源 对象时必须加锁处理.但是锁的实现有很多种方法,下面就来一起了解一下在C#语言中几种锁的实现与其性能表现. 一.c#下的几种锁的运用方式 1.临界区,通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 1 private static object obj =

python-多线程同步中创建互斥锁解决资源竞争的问题

import threadingimport time # 定义一个全局变量g_num = 0 def test1(num): global g_num for i in range(num): g_num += 1 print('-------in test1 g_num={}'.format(g_num)) def test2(num): global g_num for i in range(num): g_num += 1 print('-------in test1 g_num={}'

C++11线程指南(七)--资源竞争条件

1. 接口设计1 下面例子使用vector实现了一个栈.两个线程轮流从中弹出元素. #include <iostream> #include <thread> #include <mutex> #include <string> #include <vector> std::mutex myMutex; class Stack { public: Stack() {}; ~Stack() {}; void pop(); int top() { r

【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源

线程安全一直是程序员们关注的焦点.多线程也一直是比較让人头疼的话题,想必大家以前也遇到过各种各种的问题.我就不再累述了.当然,解决方案也有非常多,这篇博文给大家提供一种非常好的解决线程安全问题的思路. 首先.我们先简单的认识一下ThreadLocal,之后是实例+解析,最后一句话总结. 1.认识一下ThreaLocal 认识ThreadLocal必需要通过api文档,不只具有说服力,并且它会给你更加全面的解释.以下我我给大家从api文档上截取一张图,并标出来了七点需要重点理解的内容,实例过后的解

Windows Server 2008共享资源所遇到问题设置步骤详解

很多人认为访问共享资源很简单,只要先找到共享资源,之后双击共享目标,再登录进去就可以进行访问操作了.事实上,这其中的每一步操作都可能会受到Windows系统的限制;这不,当我们尝试访问Windows Server 2008系统中的共享资源时,该系统就对其中的每一个环节设置了障碍,我们必须对症下药进行合理设置,才能扫清障碍,让共享访问一路绿灯. 1.扫清看不见障碍 按理来说,从局域网中的普通计算机中,打开网上邻居窗口就能看到目标共享资源了;可是,Windows Server 2008系统中的共享资