- 浏览: 1433628 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (363)
- oracle (43)
- 缓存策略 (4)
- 数据库设计 (7)
- IntelliJ IDEA (8)
- freemarker (3)
- JSP (12)
- java基础 (75)
- tomcat (14)
- 服务器 (10)
- maven (3)
- linux (21)
- e-learning (2)
- 手机开发 (1)
- 设计模式 (6)
- 技术之外 (2)
- 工具的使用 (8)
- HTML 5 (5)
- 网站前台 (38)
- 网站后台 (11)
- 项目管理 (12)
- 面试题 (5)
- 幽默 (0)
- 系统架构 (8)
- 创业 (10)
- div-css (5)
- 诗词歌赋 (1)
- 网络课堂组知识库 (4)
- 杂家 (3)
- android (12)
- 框架 (14)
- 读书笔记 (1)
- 孙子兵法 (1)
- mysql (3)
- 小人书 (0)
- Jquery (6)
- eclipse (2)
- 正则表达式 (1)
最新评论
-
a98709474:
写的很详细,看完了,明白了这种概念了
数据库水平切分(拆库拆表)的实现原理解析(转) -
a98709474:
MYSQL分库分表总结 -
CatchU:
7年前的招聘要求,厉害厉害
面试要求 -
luozhixiong:
<table class="bbcode&qu ...
MYSQL分库分表总结 -
沈寅麟:
好用
freemarker格式化
由于servlet 是多线程单例的。
struts1 的前端控制器是单例的,线程不安全的;每次请求都会用同一actionServlet;
struts2 的action不是单例的,线程安全的;每次请求都会新new一个action来接收;
因此如果使用 servlet 或者strtus1 线程安全问题,不能不考虑,下面内容。
同步的概念:
同步分为 同步方法 和 同步块 两种方式。
锁定的内容分为 锁定类定实例 和 锁定类对象 两种方式。
变量分为 实例变量(不带static的变量) 和 类变量(带static的变量)
变量分为 属性 和 方法
使用同步的原因
1. 在系统中对访类要使用多线程进行访问;
2. 在该类中有 类变量, 或者是 在类的方法中有访问 公共资源(如一个外部文件的读写)。
同步锁锁定的内容是什么?
无论你将Synchronized加在方法前还是加在一个变量前,其锁定的都是一个 类对象。 每一个对象都只有一个锁与之相关联。
下例中分情况的列举各种情况下的同步效果
1. Synchronized 加在方法上, (同步方法,锁定类实例)
这两种写法的效果是一样的,锁定的都是类实例对象。如果有一个 类实例对象: demo = new Demo1(),另外有两个线程: thread1,thread2,都调用了demo 对象,那么,在同一时间,如果 thread1调用了demo.m1(),则thread2在该时间内不能访问demo.m1() 和 demo.m2(); 因为thread1把demo这个对象的锁使用了,所以无法分给其它线程使用,但是,如果thread1调用 demo1.m1(), thread2调用 demo2.m1(), 则可以同时进行,因为它们调用的是不同的Demo1类对象实例。
2. Synchronized 加在变量上, (同步块,锁定类实例)
这种情况下,是实现代码块锁定,锁定的对象是 变量 a 或 b; (注意,a 、b 都是非static 的)如果有一个 类实例对象: demo = new Demo2(),另外有两个线程: thread1,thread2,都调用了demo 对象,那么,在同一时间,如果 thread1调用了demo.m1(),则thread2在该时间内可以访问demo.m2();但不能访问 demo.m1() 的同步块, 因为a被 thread1锁定了。
3. Synchronized 锁定的是 类变量 ,即static 变量(可能是属性,可能是方法)(锁定类对象)
4. 类的方法中访问了多线程共同的资源, 且该资源是可变的,这种情况下也是需要进行同步的
这种情况下,必须锁定为 类变量,而不能进行锁定类实例对象,因为这是变象的一种类资源共享,而不是类实例对象资源共享。
线程,成也其,败也其,用好了可以提升性能,用不好则会使系统后患无穷。
PS: 进行线程同步需要很大的系统开销, 所以,在使用时,如果不是必须的,则尽量不使用同步功能。
struts1 的前端控制器是单例的,线程不安全的;每次请求都会用同一actionServlet;
struts2 的action不是单例的,线程安全的;每次请求都会新new一个action来接收;
因此如果使用 servlet 或者strtus1 线程安全问题,不能不考虑,下面内容。
同步的概念:
同步分为 同步方法 和 同步块 两种方式。
锁定的内容分为 锁定类定实例 和 锁定类对象 两种方式。
变量分为 实例变量(不带static的变量) 和 类变量(带static的变量)
变量分为 属性 和 方法
使用同步的原因
1. 在系统中对访类要使用多线程进行访问;
2. 在该类中有 类变量, 或者是 在类的方法中有访问 公共资源(如一个外部文件的读写)。
同步锁锁定的内容是什么?
无论你将Synchronized加在方法前还是加在一个变量前,其锁定的都是一个 类对象。 每一个对象都只有一个锁与之相关联。
下例中分情况的列举各种情况下的同步效果
1. Synchronized 加在方法上, (同步方法,锁定类实例)
public class Demo1 { public synchronized void m1(){ //............... } public void m2(){ //............ synchronized(this){ //......... } //........ } }
这两种写法的效果是一样的,锁定的都是类实例对象。如果有一个 类实例对象: demo = new Demo1(),另外有两个线程: thread1,thread2,都调用了demo 对象,那么,在同一时间,如果 thread1调用了demo.m1(),则thread2在该时间内不能访问demo.m1() 和 demo.m2(); 因为thread1把demo这个对象的锁使用了,所以无法分给其它线程使用,但是,如果thread1调用 demo1.m1(), thread2调用 demo2.m1(), 则可以同时进行,因为它们调用的是不同的Demo1类对象实例。
2. Synchronized 加在变量上, (同步块,锁定类实例)
public class Demo2 { Object a = new Object(); Object b = new Object(); public void m1(){ //............ synchronized(a){ //......... } //........ } public void m2(){ //............ synchronized(b){ //......... } //........ } }
这种情况下,是实现代码块锁定,锁定的对象是 变量 a 或 b; (注意,a 、b 都是非static 的)如果有一个 类实例对象: demo = new Demo2(),另外有两个线程: thread1,thread2,都调用了demo 对象,那么,在同一时间,如果 thread1调用了demo.m1(),则thread2在该时间内可以访问demo.m2();但不能访问 demo.m1() 的同步块, 因为a被 thread1锁定了。
3. Synchronized 锁定的是 类变量 ,即static 变量(可能是属性,可能是方法)(锁定类对象)
public class Demo3 { static Object o = new Object(); public static synchronized void m1() { //.... } public static void m2() { //... synchronized (Demo3.class) { //..... } //..... } public static void m3() { //.......... try { synchronized (Class.forName("Demo3")) { //............ } } catch (ClassNotFoundException ex) { } //............. } public static void m4() { //............ synchronized(o){ //........ } //.......... } }以上4个方法中实现的效果都是一样的,其锁定的对象都是类Demo3,而不是类实例对象 ,即在多线程中,其共享的资源是属于类的,而不是属于类对象的。在这种情况下,如果thread1 访问了这4个方法中的任何一个, 在同一时间内其它的线程都不能访问 这4个方法。
4. 类的方法中访问了多线程共同的资源, 且该资源是可变的,这种情况下也是需要进行同步的
public class Demo4 { static String path = "file path"; public void readConfiFile() { synchronized (path) { // 读取该path指定的文件。 } } public void writeConfiFile() { synchronized (path) { //写信息到该path指定的文件。 } } }
这种情况下,必须锁定为 类变量,而不能进行锁定类实例对象,因为这是变象的一种类资源共享,而不是类实例对象资源共享。
线程,成也其,败也其,用好了可以提升性能,用不好则会使系统后患无穷。
PS: 进行线程同步需要很大的系统开销, 所以,在使用时,如果不是必须的,则尽量不使用同步功能。
发表评论
-
打印IP 来源
2014-10-16 22:07 953<% String userAgent = reques ... -
java 写文本换行
2014-08-08 18:34 1985import org.apache.commons.io.Fi ... -
DBCP连接池配置示例
2014-06-17 11:44 1250<bean id="dataSourceOra ... -
CGLIB与asm
2014-05-05 14:42 1352“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言 ... -
201404转成 2014.04
2014-03-31 17:45 1004public static void main(Str ... -
取出 字符串中的 网址
2013-10-15 17:47 1270public static void main(Str ... -
java反国际化
2013-09-23 18:10 1023public static String fromEn ... -
AtomicInteger与Volatile修饰
2013-02-05 11:50 6052今天写代码,尝试使用了AtomicInteger这个类,感觉 ... -
ExecutorService线程池
2013-02-05 11:40 1628http://blog.sina.com.cn/s/blog ... -
web.xml中load-on-startup的作用
2012-12-24 10:06 1669如下一段配置,熟悉DWR的再熟悉不过了: <servle ... -
最新版本
2012-09-13 09:28 1016Java SE 7u7 apache-tomcat-7.0. ... -
格式化数字
2012-09-10 20:12 907public static void main(Str ... -
用apache common io包获得文件扩展名
2012-09-09 23:11 1377apache common io包包含了很多非常实用的工具类, ... -
值传递,引用传递
2012-07-28 23:29 1151java 对于 8种基本类型 和 他们的包装类型 , 外 ... -
代码之丑
2012-07-07 22:01 2439原文:http://www.infoq.com/cn/news ... -
Memcache
2012-06-27 09:36 1047Memcache是一个高性能的分布式的内存对象缓存系统,通过在 ... -
ActiveMQ
2012-06-14 15:09 15163ActiveMQ 是Apache出品,最流行的,能力强劲的开源 ... -
proxool配置
2012-06-12 11:43 1193项目结构 所需jar包 proxool.prope ... -
各种文件的注释
2012-04-23 10:44 1016<%-- comment --%> JSP注释,也称为“隐藏注 ... -
List排序
2012-03-27 20:18 1206集合类List存放的数据,默认是按照放入时的顺序存放的,比如依 ...
相关推荐
Java多线程同步机制研究分析 Java多线程同步机制是Java编程语言中的一种机制,它允许多个线程同时执行,提高了系统资源的利用率和安全性。但是,多线程中最重要的问题是线程的同步和共享资源的访问保护。本文通过对...
Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用synchronized关键字还不能...
Java多线程同步机制的应用分析是指在Java语言中,如何使用同步机制来保护临界区,以避免多线程之间的冲突和错误。该机制通过管程机制和同步语法来保护临界区,使得多线程可以安全、高效地运行。 在多线程编程中,...
文章首先介绍了Java多线程同步的必要性和重要性,然后讨论了Java多线程同步机制的实现方法,包括使用synchronized关键字和Java.util.concurrent.locks包中的Lock对象。接着,文章讨论了Java多线程同步机制中可能出现...
Java多线程同步是Java编程中至关重要的一部分,特别是在并发编程领域。Java提供了多种同步机制来确保线程安全,防止数据不一致性和竞态条件。在Java中,synchronized关键字是实现线程同步的关键,它提供了互斥访问,...
标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`synchronized`关键字创建互斥锁,确保同一时间只有一个线程可以访问特定的代码块或方法。 描述中的"一个多线程访问的同...
Java多线程同步是Java编程中关键的并发概念,它涉及到如何在多个线程访问共享资源时保持数据的一致性和完整性。`java.util.concurrent`包是Java提供的一个强大的并发工具库,它为开发者提供了多种线程安全的工具,...
Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...
总结起来,Java多线程同步是通过`synchronized`关键字实现的,它可以应用于方法或代码块,保证同一时刻只有一个线程能够执行特定的代码。通过合理使用同步机制,开发者可以有效地管理并发程序中的资源访问,避免数据...
通过分析并实践`threadTest`案例,我们可以深入理解Java多线程的原理和使用技巧,为编写高效并发程序打下坚实基础。同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的...
根据给定文件的信息,本篇文档是关于Java多线程同步技术在简易模拟售票系统中的应用研究。文档详细介绍了多线程的概念、如何在Java中创建线程、线程同步技术以及如何利用这些技术来解决共享资源访问时的数据一致性...
Java 多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池) Java 多线程是 Java 语言中的一种并发编程机制,允许程序同时执行多个线程,以提高程序的执行效率和响应速度。 Java 多线程机制提供了...
在Java编程语言中,多...同时,理解并掌握这些同步机制的原理和使用场景,对于提升Java多线程编程的能力至关重要。在实际开发中,要特别注意死锁、活锁和饥饿等问题,避免因线程同步不当而导致的性能下降或程序错误。
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
Java中的`synchronized`...总之,`synchronized`关键字在Java多线程编程中扮演着关键角色,确保了共享资源的安全访问,避免了竞态条件和数据不一致。理解和熟练运用`synchronized`对于编写健壮的并发程序至关重要。
Java多线程同步synchronized Java多线程同步synchronized是Java编程语言中最基本的同步机制之一。它通过锁机制来实现多线程之间的同步,确保多个线程访问共享资源时的安全性。 在Java中,synchronized关键字可以...
Java多线程同步是编程中一个非常重要的概念,特别是在并发编程中,用于解决多个线程访问共享资源时可能引发的数据不一致问题。本实例通过一个简单的火车票售票系统来演示同步机制的应用。 在这个实例中,我们创建了...
总之,掌握Java多线程的生命周期、创建、启动、同步以及线程池的使用是编写高效、稳定并发程序的基础。理解这些知识点对于解决并发编程中的问题,比如资源竞争、死锁、线程安全性等问题,至关重要。在实际开发中,...