`
badboy_blue
  • 浏览: 48476 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java并发编程2

    博客分类:
  • java
 
阅读更多

线程安全
调用某函数操作某对象,该对象暂时处于不可用状态,等到操作完成才能回到可用状态。
其他线程企图访问一个不可用状态的对象,该对象不能正确响应而产生无法预料的结果,线程安全的核心问题就是避免这种情况。

servlet的线程安全性
servlet/jsp默认是使用多线程模式执行的。
无状态的servlet、有状态的servlet(含有类实例变量)
解决线程不安全性:
1、取消servlet的类实例变量,编程无状态的servlet
2、对共享数据进行同步操作,使用synchronized关键字保证一次只有一个线程访问被保护的区段。

public class ConcurrentServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    //这样定义成类实例变量就是有状态的servlet
    //int result=0;
    public ConcurrentServlet() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String s1 = request.getParameter("num1");
        String s2 = request.getParameter("num2");
        int result=0; //这样定义就是无状态servlet
        if(s1!=null && s2!=null) {
            result = Integer.parseInt(s1) * Integer.parseInt(s2);
        }
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        PrintWriter out = response.getWriter();
        out.println(result);
        out.close();
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

public class Concurrent2Servlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    int result=0;
    public Concurrent2Servlet() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String s1 = request.getParameter("num1");
        String s2 = request.getParameter("num2");
        synchronized (this) {
            if(s1!=null && s2!=null) {
                result = Integer.parseInt(s1) * Integer.parseInt(s2);
            }
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            PrintWriter out = response.getWriter();
            out.println(result);
            out.close();
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
 


同步和互斥
线程干扰

public class BankAccount {
    private int number;
    private int balance;
    public BankAccount(int number, int balance){
        this.number = number;
        this.balance = balance;
    }
    public void deposit(int amount){
        balance = balance + amount;
    }
    public void withdraw(int amount){
        balance = balance - amount;
    }
    public int getBalance() {
        return balance;
    }
    static class Depositer implements Runnable{
        BankAccount account;
        int amount;
        public Depositer(BankAccount account, int amount){
            this.account = account;
            this.amount = amount;
        }
        @Override
        public void run() {
            for(int i=0; i<10000; i++){
                account.deposit(amount);
            }
        }
    }
    static class Withdrawer implements Runnable{
        BankAccount account;
        int amount;
        public Withdrawer(BankAccount account, int amount){
            this.account = account;
            this.amount = amount;
        }
        @Override
        public void run() {
            for(int i=0; i<10000; i++){
                account.withdraw(amount);
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        BankAccount a = new BankAccount(1, 1000);
        Thread t1 = new Thread(new Depositer(a, 100), "depositer");
        Thread t2 = new Thread(new Withdrawer(a, 100), "withdrawer");
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(a.getBalance());
    }
}

 

同步
当两个线程需要使用同一个对象时,存在交叉操作破坏数据独立性的可能,同步可以避免这种线程干扰。
java提供synchronized关键字来支持内在锁
1、同步方法中的锁

public synchronized void deposit(int amount){
        balance = balance + amount;
}
public synchronized void withdraw(int amount){
        balance = balance - amount;
}

线程调用同步方法时自动获得这个方法所在对象的内在锁,发放返回时释放,发生未捕获的异常时也会释放。
2、同步语句

public void deposit(int amount){
    synchronized(this){
        balance = balance + amount;
    }
}
public void withdraw(int amount){
    synchronized(this){
        balance = balance - amount;
    }
}

同步语句需要制定提供锁的对象
3、同步类
synchronized修饰类,该类的所有方法都是同步方法。
4、可重入同步
不太理解

同步与volatile
java提供了一种同步机制,不提供对锁的独占访问,同样可以确保对变量的每个读取操作都返回最近写入的值,这种机制就是只使用volatile变量。

活性
死锁、饿锁、活锁
死锁,多个线程竞争共享资源,每个线程都被阻塞,不能结束,进入永远等待状态。
死锁案例,哲学家用餐问题。
饿锁,共享资源被贪婪线程长期占用,其他线程不能获取共享资源,不能继续工作。
活锁,线程没有被锁定,只是忙于互相响应,以至不能恢复工作。

ThreadLocal变量
ThreadLocal是Thread的局部变量,ThreadLocal为每个使用该变量的线程提供独立的副本,

public class SequenceNumber {
    //匿名子类创建ThreadLocal变量
    private static ThreadLocal<Integer> seq = new ThreadLocal<Integer>(){
        public Integer initialValue() { //覆盖初始化方法
            return 0;
        }
    };
    public Integer getNextNumber(){
        seq.set(seq.get()+1);
        return seq.get();
    }
    private static class TestClient extends Thread {
        private SequenceNumber sn;
        public TestClient(SequenceNumber sn){
            this.sn = sn;
        }
        public void run() {
            for(int i=0; i<3; i++) {
                System.out.println("Thread["+Thread.currentThread().getName()
                        +"] sn["+sn.getNextNumber()+"]");
            }
        }
    }
    public static void main(String[] args) {
        SequenceNumber sn = new SequenceNumber();
        TestClient t1 = new TestClient(sn);
        TestClient t2 = new TestClient(sn);
        TestClient t3 = new TestClient(sn);
        t1.start();
        t2.start();
        t3.start();
    }
}

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题,但是:
同步机制使用‘以时间换空间’的方式,提供一份变量,让不同的线程排队访问;
ThreadLocal使用‘以空间换时间’的方式,为每个线程提供一份变量,同时访问互不影响。

高级并发对象
java.lang.concurrent
Lock对象、执行器、并发集合、原子变量、同步器。

分享到:
评论

相关推荐

    java 并发编程2

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。《Java并发编程实践》(Addison.Wesley.Java.Concurrency.in.Practice.May.2006.chm)...

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    Java 并发编程实战.pdf

    《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...

    java并发编程艺术

    《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...

    《java 并发编程实战高清PDF版》

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...

    JAVA并发编程艺术 高清pdf

    JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。

    java并发编程实战中文加英文版加源码

    JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...

    java并发编程内部分享PPT

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者...

    java并发编程实战(英文版)

    ### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...

    Java并发编程实战华章专业开发者书库 (Tim Peierls 等 美Brian Goetz).pdf

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...

    java 并发编程的艺术pdf清晰完整版 源码

    《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...

    java并发编程书籍

    2. **同步机制**:Java并发编程的核心在于同步,以防止数据不一致性和资源竞争。`synchronized`关键字用于实现临界区的互斥访问,确保同一时刻只有一个线程执行特定代码块。此外,还有`wait()`, `notify()`, `...

    Java并发编程实践高清pdf及源码

    《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

    java并发编程实践pdf笔记

    Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...

    Java并发编程从入门到精通(pdf)(附源码)

    《Java并发编程从入门到精通》是一本专为Java开发者设计的深度学习并发编程的书籍。作者韩剑锋,凭借其12年的IT行业经验,曾担任多家IT公司的研发总监和技术总监,以其丰富的实战经验和深厚的理论知识,为读者提供了...

Global site tag (gtag.js) - Google Analytics