`
十三月的
  • 浏览: 168065 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

线程同步,原来你很有意思

阅读更多

 

     看了篇文章,关于线程同步的,觉得很符合自己的逻辑思考方式,于是总结下自己的思路。(主要以问题为导向)

1:多线程的引入,解决了什么?

     首先是了解同步I/O操作和异步I/O操作的区别。同步操纵是指在执行I/O操作的时候,方法会一直处于等待的状态中,直到I/O操作完成;异步操作是指一旦I/O操作开始执行,程序就可以转向其他地方执行其他操作。

     显然异步的出现,可以很好的利用CPU资源。对于在同一时刻操作系统可能需要面对多个I/O操作的问题,如果是同步操作的话,该时刻只能有一个线程执行,其他的都会处于等待状态,而采用多线程的话,刚好就解决了上述的问题。显然多线程并不是为了提高程序运行的效率,而是通过提高系统的资源的利用率提高了系统的效率。                                                          

2:除了解决问题还带来了什么问题或者说需要注意什么?

     当多个线程操作的对象是分别独立的话,毫无疑问没什么问题,但是一旦线程之间操作的对象有相同的,就需要注意了。这也就是线程的同步问题。此处的同步是指协同,互相配合的意思。比如当前正在执行了线程A,但是此时需要线程B的数据,于是线程A停下来,让B先执行,然后A在执行。

       线程同步问题有2个特征:1,共享资源;2,资源是可变的。共享不必说,如果两个线程本身就独立运行,没有共享的数据,就根本不会有什么冲突。资源可变是指,共享的资源如果是不变的,那么同步也就没什么必要了。

3:那么如何对待同步问题?

    最简单的方式就是将共享的资源加上一把锁。这把锁只有一把钥匙,各个线程需要竞争这把钥匙,只有得到了这把钥匙才能对数据进行操作,其他的线程会等待。

4:那么这把锁应该加在什么地方呢?

      按照正常的思维来讲这把所必然是属于共享文件的,理论上来讲是这样的。对于比较完善的文件系统,数据库系统来讲,他们都有自己的锁机制。然而我们平时操作的大部分都是比较简单的对象,对于这些对象怎么加锁呢?

5:对于比较简单的对象,锁应该加在那里呢?

       理论上一个可行的办法是,在每一个对象内部开辟一块内存空间准们存放这个锁,但是面临的实际问题是对于线程同步问题并不是非常普遍,如果为了解决这种概率较小的问题,此方案显然得不偿失。于是有了现在常用的办法,将同步锁加在了程序中的代码块上。

6:那么这把锁到底应该是什么样子的呢?

     java中,其实任何一个对象都可以充当。比如Synchronized(new Dog()),

这里的新建的Dog,就可以充当这样的一把锁。

7:难道就真的随便写一个对象就真的实现了同步锁吗?

     其实不是,对于对象锁还有另外的一个要求,就是对于同步线程操作共享资源的代码块中必须是同一把对象锁,就是说对象锁对各个线程来讲也是共享的。实现共享的话,可以声明一个static的成员变量类型的对象,也可以声明称final类型的,不可改变。

8:实现了同步锁,那么同步锁放在代码块中的什么位置呢?

     很简单的方式就是放在了定义的函数体上。

9:直接放在函数体上是合适的吗?

    其实是不一定合适的。原因如下:当多个线程争取同一个对象锁的时候,这些线程会有两种状态,一种是在就绪队列中,一种是在待召队列中。就好像是去医院看病,在医师的办公室里总是有几个人,在门外变有另外一个队伍。里面的是就绪队列,外面的是待召队列。每次某个线程释放对象锁的时候,处在就绪队列里的线程就会重新争夺对象锁。而处在待召队列里的线程得到某种信号后会移到就绪队列中去。所以想要实现线程的同步实际上是很耗费资源的一种操作,应该尽量缩小线程同步的范围。可以将同步关键字加在方法中的某一部分。

       写完后发现线程还是很有意思的......

          

 

 

1
2
分享到:
评论

相关推荐

    时尚有意思的vc100例

    8. **实例13**:可能涉及到线程编程,理解多线程的概念,如何创建和管理线程,以及线程间的同步和通信。 9. **实例15**:可能讲解了图形绘制,如使用GDI(Graphics Device Interface)库进行简单的图形绘制,包括...

    记一次有意思的业务实现 → 单向关注是关注,双向关注则成好友.doc

    1. **JVM锁**:使用Java内置的`synchronized`关键字或者`Lock`接口可以实现线程同步,确保同一时间只有一个线程执行关注操作。然而,当应用部署在集群环境中,不同节点间的同步问题仍然存在。 2. **分布式锁**:在...

    java实例100个小型有趣案例.7z

    4. **第四章**到**第八章**:可能继续深入,如异常处理、IO流、线程同步、网络编程、数据库连接(JDBC)或者其他高级主题,如反射、注解和泛型等。 在实践这些案例时,你可以通过阅读代码、理解逻辑、运行程序并...

    c语言经典200多个有趣的程序和游戏_c语言可以写什么有趣的程序

    11. **并发与多线程**:对于更复杂的游戏,可能需要使用到并发和多线程技术,如实现多玩家同步游戏。 12. **调试技巧**:学习如何使用GDB等调试工具对程序进行调试,是提高编程能力的重要环节。 这个压缩包中的200...

    leetcodes:代码有意思 Lol

    在解决多线程问题时,如同步、互斥锁、条件变量等,Go 语言提供了简洁的并发模型。 4. 文件操作:在 LeetCode 中,有时我们需要读写文件,例如处理输入输出数据。Go 语言提供了丰富的 I/O 操作接口,可以方便地处理...

    java两条有趣的题目

    它可能涉及线程同步与并发,这是Java中的一个复杂主题,包括synchronized关键字、volatile变量、wait()、notify()和notifyAll()方法。此外,题目可能要求实现Java集合框架中的某种接口,如List、Set或Map,或者要求...

    一些Java小程序,总有适合的

    6. **多线程**:Java支持多线程编程,可能有Thread类和Runnable接口的使用,以及同步机制如synchronized关键字、wait()、notify()等。 7. **IO与NIO**:Java的New IO (NIO) 提供了一种非阻塞的I/O模型,对于高性能...

    leetcode下载-Algorithm:算法工具包合集

    记录一些很有意思的小代码.包括一些常见的面试题,及一些奇技淫巧. csy.array:数组相关 csy.backtracking:回溯法 八皇后 全排列 组合 csy.bbst: 红黑树 csy.binarytree:二叉树,包括插入 删除 前中后序遍历 搜索,中序...

    java局域网坦克大战

    8. **多线程**:为了实现游戏的并行处理,如玩家操作与游戏逻辑的同步,多线程技术是必不可少的。Java的Thread类和ExecutorService可以帮助开发者实现这一目标。 9. **测试与调试**:在开发过程中,单元测试和集成...

    JavaPrograms:有趣的Java程序

    在一些示例中,可能看到并发和同步的概念被巧妙地运用。 9. **反射和动态代理**:高级Java特性,如反射,可以让程序在运行时检查和操作类的信息,而动态代理则可用于实现AOP(面向切面编程)或动态创建代理类。 10...

    【RT-Thread作品秀】基于ART-PI和RTT-Nano的战争雷霆游戏战机飞行参数外设-电路方案

    互斥量:用来同步线程。 组件部分:无。 软件包部分:无 硬件框架ST-Link串口部分接收来自PC的数据,4.3寸显示TouchGFX UI。 软件框架说明 软件框图 软件流程图 WarThunder数据解析任务负责解析来自PC串口通信的飞行...

    JAVA上百实例源码以及开源项目源代码

    Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:...

    python3.5和python3.6开发用到的dlib库

    4. **线程和并发编程**:提供了一种高效的方式来管理和同步多线程程序。 **二、安装dlib库** 在Python环境中,通常我们使用`pip`来安装库。然而,对于dlib这样的库,由于其包含C++部分,直接使用`pip install dlib`...

    Stm32_RawOs

    5. **信号量和互斥锁**:这些是用于实现线程间通信和同步的机制。信号量用于控制对共享资源的访问,而互斥锁则确保同一时间只有一个任务可以访问特定的资源,从而避免数据竞争问题。 6. **队列和邮箱**:RawOS可能...

Global site tag (gtag.js) - Google Analytics