多线程学习(八)线程的同步-同步块

转载 2016年06月01日 11:30:33

转自:http://lavasoft.blog.51cto.com/62575/221922

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

对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。
追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。
 
在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题。
/** 
* Java线程:线程的同步-同步代码块 

* @author leizhimin 2009-11-4 11:23:32 
*/
 
public class Test { 
        public static void main(String[] args) { 
                User u = new User("张三", 100); 
                MyThread t1 = new MyThread("线程A", u, 20); 
                MyThread t2 = new MyThread("线程B", u, -60); 
                MyThread t3 = new MyThread("线程C", u, -80); 
                MyThread t4 = new MyThread("线程D", u, -30); 
                MyThread t5 = new MyThread("线程E", u, 32); 
                MyThread t6 = new MyThread("线程F", u, 21); 

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


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

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

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


class User { 
        private String code; 
        private int cash; 

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

        public String getCode() { 
                return code; 
        } 

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

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

        @Override 
        public String toString() { 
                return "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资源也没有意义,因为你占用着锁,其他互斥线程还是无法访问同步程序块。当然与同步程序块无关的线程可以获得更多的执行时间。
 

(二) Java多线程详解之同步代码块synchronized和线程通信详解

在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源,并且对资源做了写操作时,可能会导致数据混乱。这里用了卖票的例子,代码如下:public class ThreadExampl...
  • RobertoHuang
  • RobertoHuang
  • 2017年05月17日 22:06
  • 812

多线程同步与死锁深入分析

多线程同步与死锁深入分析 前言 在多线程开发中,同步与死锁是非常重要的,在本篇文章中,读者将会明白一下几点: 1、哪里需要同步 2、如何实现同步 3、以及实现同步之后会有哪些副作用 例子 ...
  • yangwenxue_admin
  • yangwenxue_admin
  • 2016年04月10日 17:53
  • 1880

同步线程和异步线程的区别

1:同步可以看做是一个单线程操作,只要客户端请求了,在服务器没有反馈信息之前是一个线程阻塞状态(就是假死状态,不能操作其他方法)。 2:异步肯定是个多线程。在客户端请求时,可以执行其他线程,并且...
  • u014419806
  • u014419806
  • 2016年10月10日 13:29
  • 11038

从头认识多线程-2.17 同步静态方法和静态代码块

这一章节我们来讨论一些同步静态方法和静态代码块。代码清单package com.ray.deepintothread.ch02.topic_17; /** * * @author RayLee...
  • raylee2007
  • raylee2007
  • 2016年05月11日 15:20
  • 3302

java多线程:线程的同步-同步块

除了同步,同步方法外,还可以使用同步dai'm 转载自 http://lavasoft.blog.51cto.com/62575/221922...
  • carl_jiang
  • carl_jiang
  • 2014年08月29日 11:11
  • 193

多线程_同步的特点及好处和弊端

package cn.itcast_10; /* * 举例: * 火车上厕所。 * 一节车箱里面的所有人(多线程),1号座位去上厕所(共享资源)门(synchronized)关上了,其...
  • L1585931143
  • L1585931143
  • 2017年03月12日 23:07
  • 310

java中synchronization修饰的同步块的同步原理及出现异常时的自动资源释放原理

在java语言里,我们要进行同步块的控制,一般使用锁和synchronization关键字,用lock同步是在代码层进行资源的抢占控制, 而用synchronization进行的同步jvm层的控制,...
  • pml18710973036
  • pml18710973036
  • 2017年03月12日 15:54
  • 378

多线程同步概念

不管是多线程还是多进程,涉及到共享相同的内存时,需要确保好同步问题。 对线程来说,需要确保每个线程看到一致的数据视图。   如果每个线程使用的变量都是其他线程不会读取和修改的,那么就不存在一致性...
  • zhouzhenhe2008
  • zhouzhenhe2008
  • 2017年04月24日 19:09
  • 221

【多线程】使用信号量进行同步

信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信号量的变量及对它进行的两个原语操作。信号量为一个整数,我们设这个信号量为:sem。很显然,我们规定在sem大于等于...
  • yusiguyuan
  • yusiguyuan
  • 2013年11月03日 22:24
  • 1582

CUDA之同步函数详解

之前在写程序的时候,经常用弄混同步函数,现做出总结。 _syncthreads():线程块内线程同步;保证线程会肿的所有线程都执行到同一位置; 当整个线程块走向同一分支时才可以使用_syncthr...
  • Bruce_0712
  • Bruce_0712
  • 2017年03月22日 20:13
  • 1481
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程学习(八)线程的同步-同步块
举报原因:
原因补充:

(最多只允许输入30个字)