`

java 多线程 sync

    博客分类:
  • java
阅读更多
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关键字的方法
它是互斥锁 对象级的

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多线程安全集合

    在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...

    JAVA 数据同步软件Sync源代码

    总结来说,【JAVA 数据同步软件Sync源代码】提供了关于JAVA文件操作、多线程同步、并发控制以及异常处理的实际应用示例,对于JAVA初学者来说,这是一个极好的实践项目,可以帮助他们巩固理论知识并提升实际编程能力...

    多线程学习笔记

    多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...

    Springboot Druid多数据源 多线程

    对于初学者,这是一个很好的学习资源,可以深入理解Spring Boot的自动配置、Druid的数据源管理和Java的多线程编程。同时,对于有经验的开发者,这个项目也可以作为一个基础,进一步扩展到更复杂的数据库同步和分布式...

    Java多线程中使用synchronized说明

    在Java多线程编程中,`synchronized`有多种用法,包括修饰实例方法、静态方法以及作为代码块来锁定特定的对象引用。 1. **修饰实例方法**: 当`synchronized`关键字用于实例方法时,它会对该实例对象加锁。这意味...

    Java 多线程与并发(12-26)-JUC锁- ReentrantReadWriteLock详解.pdf

    在Java多线程并发编程中,ReentrantReadWriteLock(可重入读写锁)是一个重要的同步工具,它属于Java并发包(java.util.concurrent.locks)中的一个类。这个锁提供了比标准的synchronized关键字更细粒度的控制,允许...

    多线程countDownLatch方法介绍

    在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...

    马士兵多线程训练营笔记

    在IT领域,多线程是并发编程中的一个关键概念,特别是在Java这样的多线程支持语言中。马士兵是一位知名的IT教育专家,他的多线程训练营笔记深入浅出地讲解了这一主题,帮助开发者理解并掌握多线程的精髓。 多线程...

    线程笔记(多线程,异常)

    9. **线程模式**:主要有两种模式,MTA(多线程单元)和STA(单线程单元)。.NET默认为STA,而ASP.NET页面通常是MTA。`Thread.ApartmentState`属性可以设置线程模式。 10. **线程池**:`ThreadPool`类提供了一种...

    Java 多线程与并发(11-26)-JUC锁- ReentrantLock详解.pdf

    Java中的ReentrantLock是Java并发包(java.util.concurrent.locks)中的一个高级锁,它是可重入的,意味着一个线程可以多次获取同一锁。在深入ReentrantLock之前,我们首先需要了解Java并发编程的基础,特别是Java...

    java性能调休分析sync-profiler+FlameGraph

    首先,`sync-profiler`是一个用于Java和JVM应用的高性能、低开销的剖析工具,它能够提供对线程、CPU、方法、锁等多方面的详细信息。`sync-profiler`不仅支持采样模式,还支持事件触发模式,这使得我们可以在特定事件...

    java多线程编程之使用Synchronized关键字同步类方法

    在Java多线程编程中,`synchronized`关键字是一个至关重要的工具,用于处理并发访问时可能出现的数据一致性问题,也就是防止“脏数据”问题。当多个线程试图访问和修改同一块共享资源时,如果不加控制,可能会导致...

    Java多线程中的单例模式两种实现方式

    Java多线程中的单例模式两种实现方式 单例模式是Java中一种常用的设计模式,用于限制一个类只能有一个实例对象。然而,在多线程环境下,单例模式的实现变得更加复杂。 Java多线程中的单例模式两种实现方式主要介绍...

    java多线程编程之使用Synchronized块同步方法

    Java多线程编程中,`synchronized`关键字是实现线程同步的关键,它可以防止多个线程同时访问共享资源,从而避免数据不一致的问题。在Java中,`synchronized`有两种使用方式:同步方法和同步代码块。 1. 同步方法: ...

    DataSync java

    在"DataSync Java"这个项目中,可能涉及到上述的多种数据同步技术,通过合理的并发控制策略,确保数据在多线程环境下的准确性和一致性。项目的具体实现细节将取决于需求,可能包括数据库同步、文件系统同步、网络...

    java多线程编程之使用Synchronized块同步变量

    在Java多线程编程中,`synchronized`关键字是一个至关重要的概念,用于控制并发访问共享资源,以确保数据的一致性和完整性。当我们说"使用`synchronized`块同步变量"时,意味着我们想要确保在同一时间只有一个线程...

    Java 线程的生命周期完整实例分析

    在 Java 中,我们可以通过使用 Thread 的生命周期来实现多线程之间的同步和通信。 一、 新建(New)阶段 在 Java 中,当我们创建一个线程时,它首先处于新建阶段。这时,线程对象已经创建,但还没有启动。我们可以...

    hhg多线程编程Demo1

    在"hhg多线程编程Demo1"中,可能使用了各种机制,如GCD(Grand Central Dispatch)的`dispatch_async`和`dispatch_sync`函数,或者是Android中的`Handler`、`Looper`和`Runnable`。这些机制确保了分线程加载的数据...

    java同步synchronized关键字用法示例

    Java中的`synchronized`...总之,`synchronized`关键字在Java多线程编程中扮演着关键角色,确保了共享资源的安全访问,避免了竞态条件和数据不一致。理解和熟练运用`synchronized`对于编写健壮的并发程序至关重要。

    VB.Net2010多线程操作(高清视频+源码).zip

    VB.NET 2010 多线程操作是编程领域中的一个重要主题,特别是在处理大量数据或需要并发执行多个任务时。多线程技术允许程序在单个进程中同时执行多个独立的任务,极大地提高了程序的效率和响应性。在这个教程中,通过...

Global site tag (gtag.js) - Google Analytics