Java线程:线程的同步-同步块

        对于同步除了同步思路方法外还可以使用同步代码块有时候同步代码块会带来比同步思路方法更好效果追其同步根本是控制竞争资源正确访问因此只要在访问竞争资源时候保证同时刻只能个线程访问即可因此Java引入了同步代码快策略以提高性能在上个例子基础上对oper思路方法做了改动由同步思路方法改为同步代码块模式执行逻辑并没有问题
/**
* Java线程:线程同步-同步代码块
*
* @author leizhimin 2009-11-4 11:23:32
*/
public Test {
        public void (String args) {
                User u = User("张 3", 100);
                MyThread t1 = MyThread("线程A", u, 20);
                MyThread t2 = MyThread("线程B", u, -60);
                MyThread t3 = MyThread("线程C", u, -80);
                MyThread t4 = MyThread("线程D", u, -30);
                MyThread t5 = MyThread("线程E", u, 32);
                MyThread t6 = MyThread("线程F", u, 21);

                t1.start;
                t2.start;
                t3.start;
                t4.start;
                t5.start;
                t6.start;
        }
}

MyThread extends Thread {
        private User u;
        private y = 0;

        MyThread(String name, User u, y) {
                super(name);
                this.u = u;
                this.y = y;
        }

        public void run {
                u.oper(y);
        }
}

User {
        private String code;
        private cash;

        User(String code, cash) {
                this.code = code;
                this.cash = cash;
        }

        public String getCode {
                 code;
        }

        public void Code(String code) {
                this.code = code;
        }

        /**
         * 业务思路方法
         *
         * @param x 添加x万元
         */
        public void oper( x) {
                try {
                        Thread.sleep(10L);
                        synchronized (this) {
                                this.cash x;
                                .out.prln(Thread.currentThread.getName + "运行结束增加“" + x + "”当前用户账户余额为:" + cash);
                        }
                        Thread.sleep(10L);
                } catch (InterruptedException e) {
                        e.prStackTrace;
                }
        }

        @Override
        public String toString {
                 "User{" +
                                "code='" + code + '\'' +
                                ", cash=" + cash +
                                '}';
        }
}

线程E运行结束增加“32”当前用户账户余额为:132
线程B运行结束增加“-60”当前用户账户余额为:72
线程D运行结束增加“-30”当前用户账户余额为:42
线程F运行结束增加“21”当前用户账户余额为:63
线程C运行结束增加“-80”当前用户账户余额为:-17
线程A运行结束增加“20”当前用户账户余额为:3

Process finished with exit code 0

注意:
        在使用synchronized关键字时候应该尽可能避免在synchronized思路方法或synchronized块中使用sleep或者yield思路方法synchronized块占有着对象锁你休息那么其他线程只能边等着你醒来执行完了才能执行不但严重影响效率也不合逻辑
        同样在同步块内yeild思路方法让出CPU资源也没有意义你占用着锁其他互斥线程还是无法访问同步当然和同步块无关线程可以获得更多执行时间
Tags: 

延伸阅读

最新评论

发表评论