- 浏览: 110487 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (159)
- 前端开发 (6)
- jsp (4)
- jquery (17)
- 配置文件 (2)
- Spring (10)
- java (34)
- hibernate (9)
- VC++ win32 application (6)
- C++ (6)
- MFC文件夹对话框 (1)
- C (4)
- MFC (1)
- C# (3)
- 两个路由器怎么连接 (1)
- Maven3 (3)
- Servlet (10)
- Struts2 (6)
- jdom (1)
- Struts1 (1)
- Spring MVC (2)
- Ant (5)
- SSH (6)
- oracle 10g (1)
- ibatis (3)
- JPA (3)
- EJB (2)
- XML知识 (3)
- javascript (2)
- android (1)
- FreeMarker (1)
- dwr (1)
- Ext (10)
- EXCEL (1)
最新评论
package test.sync;
public class TT implements Runnable {
int b = 100;
public synchronized void m1() {
b = 1000;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b = " + b);
}
public synchronized void m2() {
b = 2000;
System.out.println(b);
}
@Override
public void run() {
m1();
}
/**
* @param args
*/
public static void main(String[] args) {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tt.m2();
}
}
----------------------------------------------------------------------------------
输出:
b = 1000
2000
----------------------------------------------------------------------------------
t这个线程对象调用start方法后,主线程睡眠了,这个时候t就真正的被cpu调度了。
紧接着就到了run方法里 run方法里调用了m1方法,然后m1 m2方法都被锁住了
tt.m2就得等待,也就是说主线程需要等到m1执行完后才能执行m2方法
synchronized是锁住当前对象的带synchronized关键字的方法
它是互斥锁 对象级的
public class TT implements Runnable {
int b = 100;
public synchronized void m1() {
b = 1000;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b = " + b);
}
public synchronized void m2() {
b = 2000;
System.out.println(b);
}
@Override
public void run() {
m1();
}
/**
* @param args
*/
public static void main(String[] args) {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tt.m2();
}
}
----------------------------------------------------------------------------------
输出:
b = 1000
2000
----------------------------------------------------------------------------------
t这个线程对象调用start方法后,主线程睡眠了,这个时候t就真正的被cpu调度了。
紧接着就到了run方法里 run方法里调用了m1方法,然后m1 m2方法都被锁住了
tt.m2就得等待,也就是说主线程需要等到m1执行完后才能执行m2方法
synchronized是锁住当前对象的带synchronized关键字的方法
它是互斥锁 对象级的
package test.sync; public class TestSync implements Runnable { Timer timer = new Timer(); public static void main(String[] args) { TestSync test = new TestSync(); Thread t1 = new Thread(test); Thread t2 = new Thread(test); t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } public void run() { timer.add(Thread.currentThread().getName()); } } class Timer { private static int num = 0; public synchronized void add(String name) { //对象锁 互斥锁 num++; try { Thread.sleep(1); } catch (InterruptedException e) { } System.out.println(name + ", 你是第" + num + "个使用timer的线程"); } } 运行效果是: t1, 你是第1个使用timer的线程 t2, 你是第2个使用timer的线程 这个同步方法是锁定当前对象的意思,也就是timer 因为t1,t2都是用的同一个target也就是同一个test,那么也就是同一个timer package test.sync; public class TestSync implements Runnable { Timer timer = new Timer(); public static void main(String[] args) { [color=red] TestSync test1 = new TestSync(); TestSync test2 = new TestSync();[/color] Thread t1 = new Thread(test1); Thread t2 = new Thread(test2); t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } public void run() { timer.add(Thread.currentThread().getName()); } } class Timer { private static int num = 0; public synchronized void add(String name) { //对象锁 互斥锁 num++; try { Thread.sleep(1); } catch (InterruptedException e) { } System.out.println(name + ", 你是第" + num + "个使用timer的线程"); } } 上面程序的运行效果: t1, 你是第2个使用timer的线程 t2, 你是第2个使用timer的线程
发表评论
-
java的日期操作类
2014-09-16 15:00 536package cn.mldn; import ja ... -
列表框 JList
2014-08-16 19:19 487package net.mindview.util; ... -
分页类
2014-02-23 15:05 517package com.yxq.model; pub ... -
java mail
2014-02-14 15:13 401package com.util.mail; /** ... -
Map输出方式一:Iterator输出Map
2014-02-12 11:49 884package com.mldn.map; impo ... -
Comparable
2014-02-11 20:16 396package org.lxh.demo13.setdem ... -
Foreach与迭代器
2014-02-11 17:45 525到目前为止,foreach语法主要用于数组,但是它也可以应 ... -
打印流
2014-02-07 20:10 451package com.bjsxt.print; i ... -
管道流
2014-02-07 17:23 449package com.bjsxt.buffer; ... -
Tramsform IO
2014-02-07 16:15 635package com.bjsxt.transform; ... -
Buffered IO
2014-02-07 15:02 579package com.bjsxt.buffer; ... -
字符流
2014-02-07 10:32 617package com.bjsxt.reader; ... -
字节流
2014-02-06 17:57 512package com.bjsxt.stream; ... -
RandomAccessFile类
2014-02-06 13:18 594使用RandomAccessFile类写入数据 impor ... -
排序啊啊啊啊
2013-09-18 10:32 456package cn.mldn; public cl ... -
java_匿名内部类
2013-04-10 15:26 960package com.bitsoft.inner; ... -
java_内部类
2013-04-10 14:05 792package com.diaodiao.inner; ... -
JAVA----- String方面的面试举例
2013-03-31 00:55 750[img] [/img] package com.t ... -
反射机制(2)
2013-03-20 20:39 722package com.bjsxt.demo; im ... -
反射机制
2013-03-17 22:19 473package org.dcl.demo; inte ...
相关推荐
在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...
总结来说,【JAVA 数据同步软件Sync源代码】提供了关于JAVA文件操作、多线程同步、并发控制以及异常处理的实际应用示例,对于JAVA初学者来说,这是一个极好的实践项目,可以帮助他们巩固理论知识并提升实际编程能力...
多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...
对于初学者,这是一个很好的学习资源,可以深入理解Spring Boot的自动配置、Druid的数据源管理和Java的多线程编程。同时,对于有经验的开发者,这个项目也可以作为一个基础,进一步扩展到更复杂的数据库同步和分布式...
在Java多线程编程中,`synchronized`有多种用法,包括修饰实例方法、静态方法以及作为代码块来锁定特定的对象引用。 1. **修饰实例方法**: 当`synchronized`关键字用于实例方法时,它会对该实例对象加锁。这意味...
在Java多线程并发编程中,ReentrantReadWriteLock(可重入读写锁)是一个重要的同步工具,它属于Java并发包(java.util.concurrent.locks)中的一个类。这个锁提供了比标准的synchronized关键字更细粒度的控制,允许...
在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...
在IT领域,多线程是并发编程中的一个关键概念,特别是在Java这样的多线程支持语言中。马士兵是一位知名的IT教育专家,他的多线程训练营笔记深入浅出地讲解了这一主题,帮助开发者理解并掌握多线程的精髓。 多线程...
9. **线程模式**:主要有两种模式,MTA(多线程单元)和STA(单线程单元)。.NET默认为STA,而ASP.NET页面通常是MTA。`Thread.ApartmentState`属性可以设置线程模式。 10. **线程池**:`ThreadPool`类提供了一种...
Java中的ReentrantLock是Java并发包(java.util.concurrent.locks)中的一个高级锁,它是可重入的,意味着一个线程可以多次获取同一锁。在深入ReentrantLock之前,我们首先需要了解Java并发编程的基础,特别是Java...
首先,`sync-profiler`是一个用于Java和JVM应用的高性能、低开销的剖析工具,它能够提供对线程、CPU、方法、锁等多方面的详细信息。`sync-profiler`不仅支持采样模式,还支持事件触发模式,这使得我们可以在特定事件...
在Java多线程编程中,`synchronized`关键字是一个至关重要的工具,用于处理并发访问时可能出现的数据一致性问题,也就是防止“脏数据”问题。当多个线程试图访问和修改同一块共享资源时,如果不加控制,可能会导致...
Java多线程中的单例模式两种实现方式 单例模式是Java中一种常用的设计模式,用于限制一个类只能有一个实例对象。然而,在多线程环境下,单例模式的实现变得更加复杂。 Java多线程中的单例模式两种实现方式主要介绍...
Java多线程编程中,`synchronized`关键字是实现线程同步的关键,它可以防止多个线程同时访问共享资源,从而避免数据不一致的问题。在Java中,`synchronized`有两种使用方式:同步方法和同步代码块。 1. 同步方法: ...
在"DataSync Java"这个项目中,可能涉及到上述的多种数据同步技术,通过合理的并发控制策略,确保数据在多线程环境下的准确性和一致性。项目的具体实现细节将取决于需求,可能包括数据库同步、文件系统同步、网络...
在Java多线程编程中,`synchronized`关键字是一个至关重要的概念,用于控制并发访问共享资源,以确保数据的一致性和完整性。当我们说"使用`synchronized`块同步变量"时,意味着我们想要确保在同一时间只有一个线程...
在 Java 中,我们可以通过使用 Thread 的生命周期来实现多线程之间的同步和通信。 一、 新建(New)阶段 在 Java 中,当我们创建一个线程时,它首先处于新建阶段。这时,线程对象已经创建,但还没有启动。我们可以...
在"hhg多线程编程Demo1"中,可能使用了各种机制,如GCD(Grand Central Dispatch)的`dispatch_async`和`dispatch_sync`函数,或者是Android中的`Handler`、`Looper`和`Runnable`。这些机制确保了分线程加载的数据...
Java中的`synchronized`...总之,`synchronized`关键字在Java多线程编程中扮演着关键角色,确保了共享资源的安全访问,避免了竞态条件和数据不一致。理解和熟练运用`synchronized`对于编写健壮的并发程序至关重要。
VB.NET 2010 多线程操作是编程领域中的一个重要主题,特别是在处理大量数据或需要并发执行多个任务时。多线程技术允许程序在单个进程中同时执行多个独立的任务,极大地提高了程序的效率和响应性。在这个教程中,通过...