`
zds625
  • 浏览: 10980 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类

Java并发编程实践-线程安全(随笔)

    博客分类:
  • Java
阅读更多
并发的编程并不会过多的涉及线程和锁,编写线程安全的嗲吗,本质上是管理对状态的访问,而且通常是共享、可变的状态。
状态:一个对象的状态时指它的数据,存储在状态变量中,比如实力域或静态域。
共享:是指一个变量可以被多个线程访问。
可变:是指变量在其生命周期内是可以改变的。
保证线程的安全性,真正要做的是在不可控制的并发访问中保护数据。

无论何时,只要多于一个线程来访问状态变量,其中一个线程会对变量进行写操作,此时就必须使用同步来协调线程对该变量的访问。

在没有正确同步的情况下,多个线程访问一个变量,会造成隐患,可有如下方法修复:
1、不要跨线程访问变量。
2、使状态变量为不可变的。
3、访问状态变量时使用同步

线程安全性定义:无论是多线程中的时序或交替操作,都要保证不破坏那些不变约束(状态变量的一致性)

原子操作:一个单独的,不可分割的操作。
class AtomTest implements Servlet {
   private long count = 0;
   public long getCount(){return count;}
   public void service(ServletRequest request,ServletResponse response) {
   ++count;
   }
}

上述例子中,++count看上去像是一个单独的操作,但它不是原子操作,这个一个“读-改-写”的操作,在缺乏同步的条件下,两个线程试图更新这个计时器的数值时,则可能会造成结果不符合,而这种结果则是由竞争条件所引起

竞争条件:当计算的正确性依赖于运行时相关的时序或者多线程的交替时,会产生竞争条件。最常见的竞争条件是“检查再运行(check-then-act)”,使用一个潜在的过期值作为决定下一步操作的依据。

复合操作:比如我们将“检查再运行”和读-改-写的操作过程看做是复合操作。为了线程安全必须执行原子操作,计时器例子的修改,可通过已有线程安全类java.util.concurrent.atomic实现
class AtomTest implements Servlet {
   private Atomiclong count = new Atomiclong(0);
   public long getCount(){return count;}
   public void service(ServletRequest request,ServletResponse response) {
    count.incrementAndGet();
   }
}


AtomicLong可确保计时器的状态操作时原子的。

锁--内部锁
java提供了强制原子性的内置锁机制:synchronized块。synchronized块分成两部分:锁对象的引用和锁保护的代码块,锁即是所在对象本身,锁的获得是在进入synchronized时自动获得的,在正常退出或者异常的时候自动释放锁。这就意味着只有一个线程能获得锁,其他线程想获得锁就只能等待或阻塞,知道占有锁的线程释放了锁。
重进入
内部锁是可以重进入,即线程在试图获取它自己占有的锁时,是能获得成功的。重进入方便了锁行为的封装,当子类override父类的synchronized类型的方法,并调用父类的方法时,如果没有可重入锁,那么这样的使用,将产生死锁。子类的synchronized方法首先获得了锁,在调用父类synchronized方法是,如果没有锁重入,那么父类的方法将永远获得锁,重入锁避免了这种情况

0
0
分享到:
评论

相关推荐

    JAVA并发编程实践-线程安全-学习笔记

    在Java并发编程中,线程安全是一个至关重要的概念,它涉及到多线程环境下对共享数据的正确管理和访问。线程安全意味着当多个线程同时访问一个对象或数据时,对象的状态能够保持一致性和完整性,不会因为并发导致数据...

    Java并发编程实践-电子书

    Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...

    JAVA并发编程实践-线程执行-学习笔记

    总的来说,Java并发编程实践中的任务执行是一个涉及线程调度、线程池管理、任务生命周期控制、结果处理等多个方面的复杂主题。理解和掌握这些概念和技术,能够帮助开发者编写出更加高效、可靠的并发程序。

    JAVA并发编程实践-中文-高清-带书签-完整版

    《JAVA并发编程实践》是...总而言之,《JAVA并发编程实践》是一本全面而深入的指南,无论是对于初学者还是经验丰富的开发者,都能从中获得宝贵的洞见和实践经验,提升并发编程的能力,更好地应对多线程环境下的挑战。

    JAVA并发编程实践-线程对象与组合对象-学习笔记

    使用java.util.concurrent类库构造安全的并发应用程序的基础。共享其实就是某一线程的数据改变对其它线程可见,否则就会出现脏数据。

    Java并发编程实践-电子书-09章.pdf

    Java并发编程实践-电子书-09章.pdf

    Java并发编程实践--电子书.rar

    《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器普及后,利用多线程进行并发处理已经成为提升程序性能的关键技术。这本书深入...

    Java并发编程实践-电子书1-9章pdf

    《Java并发编程实践》是Java开发者深入理解并发编程的重要参考资料,尤其对于想要提升多线程应用设计和性能优化技能的程序员来说,这本书提供了丰富的实践经验和深入的理论知识。以下是根据提供的章节内容概述的一些...

    JAVA并发编程实践-构建执行程序块-学习笔记

    JAVA并发编程实践是指在JAVA编程语言中,使用多线程、并发编程来实现高效、可靠的程序执行。构建执行程序块是指在并发编程中,使用线程安全的类来管理状态,以确保程序的正确执行。 在实践中,委托是创建线程安全类...

    JAVA并发编程实践-

    - **多线程基础**:Java通过`Thread`类支持多线程编程,创建新线程可以通过继承`Thread`类或者实现`Runnable`接口来完成。 - **线程生命周期**:线程有几种状态包括新建、就绪、运行、阻塞和死亡等,了解这些状态有...

    62-Java并发编程实战

    62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...

Global site tag (gtag.js) - Google Analytics