zoukankan      html  css  js  c++  java
  • 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)

    同步代码块和同步方法的区别:同步代码块可以传入任意对象,同步方法中 如果多个线程检查的都是一个新的对象,不同的同步锁对不同的线程不具有排他性,不能实现线程同步的效果,这时候线程同步就失效了。

      两者的区别主要体现在同步锁上面。对于实例的同步方法,因为只能使用this来作为同步锁,如果一个类中需要使用到多个锁,为了避免锁的冲突,必然需要使用不同的对象,这时候同步方法不能满足需求,只能使用同步代码块(同步代码块可以传入任意对象);

    有几个原则的:
    程序次序规则:一个线程内,代码的执行会按照程序书写的顺序
    管程锁定原则:对同一变量的unlock操作先行发生于后来的lock操作
    volatile变量规则:对一个volatile的写操作先行发生于后来的读操作
    线程启动原则:Thread的start()先行发生于线程内的所有动作
    线程终止原则:线程内的所有动作都先行发生于线程的终止检测
    线程中断原则:对线程调用interrupt()先行发生于被中断的代码检测到是否有中断发生
    对象终结原则:一个对象的初始化操作先行发生于finalize()方法
    传递性:A先行发生于B,B先行发生于C,那么A先行发生于C

    Java多线程编程总结

    http://lavasoft.blog.51cto.com/62575/27069
    /** 
    * Java线程:并发协作-死锁 

    * @author Administrator 2009-11-4 22:06:13 
    */
     
    public class Test { 
            public static void main(String[] args) { 
                    DeadlockRisk dead = new DeadlockRisk(); 
                    MyThread t1 = new MyThread(dead, 1, 2); 
                    MyThread t2 = new MyThread(dead, 3, 4); 
                    MyThread t3 = new MyThread(dead, 5, 6); 
                    MyThread t4 = new MyThread(dead, 7, 8); 

                    t1.start(); 
                    t2.start(); 
                    t3.start(); 
                    t4.start(); 
            } 



    class MyThread extends Thread { 
            private DeadlockRisk dead; 
            private int a, b; 


            MyThread(DeadlockRisk dead, int a, int b) { 
                    this.dead = dead; 
                    this.a = a; 
                    this.b = b; 
            } 

            @Override 
            public void run() { 
                    dead.read(); 
                    dead.write(a, b); 
            } 


    class DeadlockRisk { 
            private static class Resource { 
                    public int value; 
            } 

            private Resource resourceA = new Resource(); 
            private Resource resourceB = new Resource(); 

            public int read() { 
                    synchronized (resourceA) { 
                            System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceA的锁!"); 
                            synchronized (resourceB) { 
                                    System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceB的锁!"); 
                                    return resourceB.value + resourceA.value; 
                            } 
                    } 
            } 

            public void write(int a, int b) { 
                    synchronized (resourceB) { 
                            System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceA的锁!"); 
                            synchronized (resourceA) { 
                                    System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceB的锁!"); 
                                    resourceA.value = a; 
                                    resourceB.value = b; 
                            } 
                    } 
            } 
    }

  • 相关阅读:
    使用反射获取对象的步骤
    金融IT的算法要求
    Java编译与反编译命令记录
    常用搜索博客/网站
    Java核心-03 谈谈final、finally、 finalize有什么不同?
    Java核心-02 Exception和Error有什么区别?
    PHP函数技巧篇
    IO
    Markdown 简单使用教程
    FZu Problem 2233 ~APTX4869 (并查集 + sort)
  • 原文地址:https://www.cnblogs.com/zhouxiansheng/p/4373681.html
Copyright © 2011-2022 走看看