【好程序员训练营】-Java多线程与并发(二)之线程同步

 android培训——我的java笔记,期待与您交流!

线程同步

1 . 多线程共享数据

在多线程操作中, 多个线程有可能同时处理同一个资源, 这就是多线程中的共享数据。 举个不太恰当的例子简单理解一下,图中是小新家的厕所茅坑,但是家里只有一个那这就是一个“资源”,那么家里的所有人都共享这同一个“资源”,也就是所谓的多线程共享数据

可以明显的看出多线程共享数据带来的问题,就是会造成数据的不确定性!就好比小新正在上着厕所,此时小新爸爸来了, 此时相当于一个资源两个人在抢, 那这就会出现问题, 这种情况也就是我们平常所说的线程不安全, 我们到下面就要解决这个线程不安全的问题!

2 . 线程同步

解决数据共享问题,必须使用同步,所谓同步就是指多个线程在同一个时间段内只能有一个线程执行指定的代码,其他线程要等待此线程完成之后才可以继续执行

线程进行同步, 有以下两种方法:

(1) 同步代码块

此种方法将需要同步的操作包裹起来, 其中同步的对象可以是任意对象,一般情况下传入this,也就是当前的对象, 可以这样理解,只要传入的同步代码块中对象相同, 其他所有方法均不可访问同步代码块中的数据(资源)

synchronized(要同步的对象){
        //要同步的操作
}

(2) 同步方法

同步方法面向的同步对象是本身, 也就是说,如果在同一类中有两个同步方法, 当执行其中一个同步方法时不仅该 同步方法中的资源不能被外界方法使用而且另一个(可能会有多个)也不能访问, 请细细理解此段话!

public synchronized void method(){
        //要同步的操作
}

同步准则

当编写synchronized 块时, 有几个简单的准则可以遵循, 这些准则在避免死锁和性能危险的风险方面大有帮助

(1) 使代码块保持简洁。把不随线程变化的预处理和后处理移出synchronized 块。

(2) 不要阻塞。如InputStream.read().

(3) 在持有锁的情况下, 不要调用其他对象的同步方法。

Lock锁

JDK1.5以后出现了一种更方便实现同步的方式-并发包(Lock), 它的性能更高, 所谓性能更高不妨说起更灵活, 在需要锁的地方加锁, 在需要去掉的地方可以去掉, 对比上述的两种方法, 必须在完成相应的代码块或者相应的方法才能去掉锁,这样不免会丢失一定的性能

class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() {
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
 }

未完待续….

以上纯属个人见解, 如有不足之处希望有高人指出, 定感激不尽, 如有喜欢交流学习经验请给我留言谢谢.

原创文章, 转载请注明出处

时间: 2024-11-05 22:53:20

【好程序员训练营】-Java多线程与并发(二)之线程同步的相关文章

黑马程序员之Java多线程学习

android培训  java培训 期待与您交流! 这一篇文章主要关于java多线程,主要还是以例子来驱动的.因为讲解多线程的书籍和文章已经很多了,所以我也不好意思多说,呵呵.大家可以去参考一些那些书籍.我这个文章主要关于实际的一些问题.同时也算是我以后复习的资料吧,.呵呵大家多多指教. 同时希望多结交一些技术上的朋友.谢谢. -------------------------------------------------------------------------------------

Java多线程(三)、线程同步(转)

Java多线程(三).线程同步 分类: javaSE综合知识点 2012-09-18 17:59 2400人阅读 评论(0) 收藏 举报 在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的控制吧. 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数

Java多线程与并发应用-(2)-线程互斥synchronized

首先请看下面的例子: package com.lipeng; public class SynchronizedDemo { public static void main(String[] args) { final Print print=new Print(); for(int i=0;i<1000;i++) { new Thread(){ @Override public void run() { print.printName("huangfeihong"); } }.

java多线程、并发系列之 (synchronized)同步与加锁机制

Synchronized Java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁.获得一个对象的锁也称为获取锁.锁定对象.在对象上锁定或在对象上同步. 当程序运行到synchronized同步方法或代码块时才该对象锁才起作用. 一个对象只有一个锁.所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁.这也意味着任何其他线程都不能进入该对象上的synchronized方法

java多线程学习(二)——线程的创建

一.java创建线程的两个方法 1.从java.lang.Thread类派生出一个新的线程类,重载它的run()方法 2.实现Runnable接口,重载Runnable接口中的run()方法. 使用Thread类来创建线程和创建普通类的对象的操作是一样的,线程是Thread类或者其子类的实例对象. 二.java提供的两种创建线程的区别 java中类是单继承的,当定义一个新的线程类的时候,它只能扩展一个外部类,那么当创建的线程是继承自Thread类来实现的,那么此线程类无法再扩展其他类,无法实现复

多线程实战(二)线程同步

当多个线程使用共享对象的时候,依次等待,这种我们通常叫着线程同步:下面介绍几种线程同步的方法: 原子操作 Mutex SemaphoreSlim AutoResetEvent ManuualResetEventSlim CountDownEvent Barrier ReaderWriterLockSlim 原子操作 所谓原子操作是指不会被线程调度机制打断的操作:用于执行轻量级.仅执行一次的操作,比如修改计数器,某些条件下的增加值或设置位等.这种操作一旦开始,就一直运行到结束,中间不会有任何 co

好程序员训练营-Java接口(interface)的概念及使用

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加"抽象". 接口使用 interface 关键字来声明,可以看做是一种特殊的抽象类,可以指定一个类必须做什么,而不

好程序员训练营-Java方法重载

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(method overloading). 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 重载是面向对象的一个基

程序员:java中直接或间接创建线程的方法总结

在java开发中,经常会涉及多线程的编码,那么通过直接或间接创建线程的方法有哪些?现整理如下: 1.继承Thread类,重写run()方法 class Worker extends Thread { @Override public void run() { System.out.println("Code run in a sub thread!"); } } public class CreateThreadTester { public static void main(Stri