`

Java 多线程之同步并发基础

阅读更多
一: 慎用volatile关键字
     volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型。如果这些简单数据类型声明为volatile,对它们的操作就会变成原子级别的。但这有一定的限制。当变量的值由自身的上一个决定时,如n=n+1、n++等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1。
     可以使用synchronized方法来替代。

/** 该例子显示了volatile失效的情况,可能要多跑几次看出 */
public class JoinThread extends Thread {
	public volatile static int n = 0;

	public void run() {
		for (int i = 0; i < 10; i++)
			try {
				n++;
				sleep(3); // 为了使运行结果更随机,延迟3毫秒
			} catch (Exception e) {
			}
	}

	public static void main(String[] args) throws Exception {
		Thread threads[] = new Thread[100];
		for (int i = 0; i < threads.length; i++)
			threads[i] = new JoinThread(); // 建立100个线程
		for (int i = 0; i < threads.length; i++)
			threads[i].start(); // 运行刚才建立的100个线程
		for (int i = 0; i < threads.length; i++)
			threads[i].join(); // 100个线程都执行完后继续
		System.out.println("n=" + JoinThread.n);
	}
}


二:向线程传递数据
    可以通过构造方法传入;设置变量及其set方法运行时注入;通过回调函数;

三:从线程返回数据
     通过设置变量及其get方法(注意此时要进行检测,get值随着线程运行阶段可能不同);通过回调函数;

四:使用synchronized同步类方法
      synchronized修饰方法是类锁定,若修饰非静态方法,只锁定对应对象实例,在两个实例中可能会同时运行;若修饰静态方法,则锁定该类静态域,确保同步。
      单件模式中,用到时才创建的时候,需要用到。
      如果在类中使用synchronized关键字来定义非静态方法,那将影响这个中的所有使用synchronized关键字定义的非静态方法。如果定义的是静态方法,那么将影响类中所有使用synchronized关键字定义的静态方法。
    
      注意:1,synchronized方法不能被继承;
            2,定义接口时不可用synchronized关键字;
            3,构造方法不可以用synchronized关键字,但可以使用synchronized块来同步;
            4,synchronized的位置可以放在返回类型之前的任意位置;
/**
 * synchronized 锁定静态方法与非静态方法
 */

//提供四个被锁定的方法
class ForTest {
	static int i = 0;

	public static synchronized void staticMethod1() {
		System.out.println("staticMethod1");
		while (i != 1)
			;
		System.out.println("staticMethod1 end");
	}

	public static synchronized void staticMethod2() {
		System.out.println("staticMethod2");
		while (i != 1)
			;
		System.out.println("staticMethod2 end");
	}

	public synchronized void staticMethod3() {
		System.out.println("staticMethod3");
		while (i != 1)
			;
		System.out.println("staticMethod3 end");
	}

	public synchronized void staticMethod4() {
		System.out.println("staticMethod4");
		while (i != 1)
			;
		System.out.println("staticMethod4 end");
	}
}

//四个调用方法的Runnable
class Runnable1 implements Runnable {
	public void run() {
		ForTest.staticMethod1();
	}
}

class Runnable2 implements Runnable {
	public void run() {
		ForTest.staticMethod2();
	}
}

class Runnable3 implements Runnable {
	
	ForTest f=null;
	
	 public Runnable3(ForTest t){
		this.f=t;
	}
	public void run() {
		f.staticMethod3();
	}
}

class Runnable4 implements Runnable {
	
	ForTest f=null;
	
	 public Runnable4(ForTest t){
			this.f=t;
		}
	 
	public void run() {
		f.staticMethod4();
	}
}

public class MyThread1 {
	
	public static void main(String[] args) throws Exception {
		ForTest t=new ForTest();
		
		Thread t1=new Thread(new Runnable1());
		Thread t2=new Thread(new Runnable2());
		Thread t3=new Thread(new Runnable3(t));
		Thread t4=new Thread(new Runnable4(t));
		
		System.out.println("start");
		t1.start();
		t2.start();
		t3.start();
		t4.start();

		Thread.sleep(1000);
		t.i=1;
		System.out.println("main end");
	}
}


五:synchronized可以锁定方法或者锁定块,不能锁变量;volatile只能锁简单类型变量。
synchronized锁非静态块时,直接锁类即可;锁静态块需要调用Class对象。

public class SyncBlock {
	
	public static void method1() {     			  //锁静态块
		synchronized (SyncBlock.class) {
		}
	}
	public static synchronized void method2() {}  //锁静态方法
	public  void method3() {    				  //锁非静态块
		synchronized (SyncBlock.class) {
		}
	}
	public  void method5() {
		synchronized (this) {
		}
	}
	public  synchronized void method4() {}  	  //锁非静态方法
}
分享到:
评论

相关推荐

    Java分布式应用学习笔记05多线程下的并发同步器

    Java分布式应用学习笔记05多线程下的并发同步器

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    Java多线程编程总结

    Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的...

    java多线程编程总结

    详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...

    java多线程笔记

    Java线程:线程的同步 33 一、 同步方法 35 二、 同步块 36 三、 volatile关键字 38 四、 使用synchronized关键字要注意以下四点 39 五、 关于同步和锁定的一些问题 41 Java线程:并发协作-线程的交互 47 Java线程:...

    java 多线程同步

    java.util.concurrent 包含许多线程安全、测试良好、高性能的并发构建块。不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发...

    Java多线程之并发工具类

     1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成)  2)CyclicBarrier(循环屏障:同步屏障)  3)Semaphore(信号量:控制并发进程数)  主要参考资料:java并发编程的艺术、Java并发——...

    详解java多线程的同步控制

    同步控制是并发程序必不可少的重要手段,本文我们将通过重入锁、读写锁、信号量、倒计数器和循环栅栏以及他们的实例来介绍Java并发程序中的同步控制。 目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ...

    java并发编程:线程基础

    本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...

    java多线程编程_java多线程_

    1.讲解了Java多线程的基础, 包括Thread类的核心API的使用。2.讲解了在多线程中对并发访问的控制, 主要就是synchronized的使用, 由于此关键字在使用上非常灵活, 所以书中用了很多案例来介绍此关键字的使用, 为...

    基于Java多线程的并发机制的研究和实现

    研究了程序并发过程中的同步机制和交互通信机制,比较了基于操作系统级和基于Java多线程级并发机制的实现结构,总结了并发程序中死锁预防的一些编程规则和策略。所构造的一个具有完全意义上的并发同步的框架实例有...

    java实现多线程间的同步与互斥(读者写者问题)

    用java实现多线程并发中的读者与写者问题,能够实现多线程对临界资源的同步有序访问。 具体实现为: 给定一个队列A[1-10][1-100000]、元素编号1-10,其中每个元素包含10万个随机数。创建若干个线程,各循环100次;...

    Java多线程和并发知识整理

    1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 2.4中断 2.5互斥同步 2.6线程合作 三、...

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    java多线程模拟处理银行的实时转账交易

    模拟实现多线程处理银行的实时转账交易,代码完整,可以完美运行~

    Java多线程编程

    包括java的Thread类,同步块(synchronized),可重入锁,Object方法以及对象监视器等内容。

    java分布式应用学习笔记05多线程下的并发同步器.pdf

    java分布式应用学习笔记05多线程下的并发同步器.pdf

    92道Java多线程与并发面试题含答案(很全)

    Java并发编程的核心概念包括: 线程(Thread):线程是程序执行流的最小单元。...原子操作(Atomic Operations):原子操作是不可中断的操作,即在多线程环境中,这些操作要么完全执行,要么完全不执行。

Global site tag (gtag.js) - Google Analytics