Java 多线程序的一点理解

synchronized 是java 内主要的同步标记

1 同步非静态方法

  作用域范围只是当前对象在不同线程间的同步, 如果n 为Test外的对象,在不同的Test对象之间,等于没有同步, 该方法只能同步n为Test类内对象

public class Test
public  synchronized void inc() {
			n++;
		}
}

  如果想同步类外的n,使用同步代码块对象,对象也为一个类外对象,相对所有Test对象来说, 也只有一个,所以就能同步

final Integer lock = new Integer(1);
	class Test  implements Runnable {
		public int value = 0;
		public  void inc() {
			synchronized (lock)
			{
				m++;
				value++;
				n++;
			}
		}

  

2  同步静态方法

public class Test
public  static synchronized void inc() {
			n++;
		}
}

  作用域范围是所有Test类对象,  inc方法在所有Test对象之间只能被一个同时调用

3  同步代码块

publci class Test{
     public  void inc() {
			synchronized (lock)
			{
				// m++;
				value++;
				n++;
			}
		}
}

  

  作用域范围,取决于lock的相对该类的作用域范围

如果lock 是该类以外的对象,相对所有的Test 对象而言,  lock是个全局变量,  synchronized同步范围在所有对象之间

如果lock 是该类以内的对象,如类内变量,相对所有的Test 对象而言,  lock是个本地局部变量,  synchronized同步范围在同一对象的不同线程之间, 和同步非静态方法一样

测试代码

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CountDownLatch;

public class TestVolatile {
	public static volatile int  n = 0; //
	public  Integer m = 0;
	final Integer lock = new Integer(1);

	class MyThread implements Runnable {
		public int value = 0;
		public  void inc() {
			synchronized (lock)
			{
				m++;
				value++;
				n++;
			}
		}

		public void run() {

			{
				for (int i = 0; i < 1000; i++)
					try {
						// System.out.println(i);
						inc();
						// m++;
						// vboolean = vboolean == true ? false : true;
						Thread.sleep(3); // 为了使运行结果更随机,延迟3毫秒
					} catch (Exception e) {
					}
			}
		}
	}

	static class MyThread1 implements Runnable {
		public static Integer locallock = new Integer(2);
		public static synchronized void inc() {
			n++;
		}

		public  void run() {
			for (int i = 0; i < 1000; i++)
				try {
					//inc();  方法一

					// 方法二
					synchronized (locallock){
					    n = n + 1;
				}
					Thread.sleep(3);
				} catch (Exception e) {
				}
		}
	}

	class MyThread2 implements Runnable {
		public void run() {
			synchronized (lock) {
				for (int i = 0; i < 100; i++)
					try {
						m++;
						Thread.sleep(3); // 为了使运行结果更随机,延迟3毫秒
					} catch (Exception e) {
					}
			}
		}
	}

	// 3和2代码一样,只是一个是分开锁, 一个只是单独加锁, 效率相差10倍左右。
	class MyThread3 implements Runnable {
		public void inc() {
			synchronized (lock) {
				m++;
			}
		}

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

	public Value g_value = new Value();
	public class Value{
		public synchronized void inc()
		{
			m++;
		}
	}

	// 4和3功能差不多,只是 MyThread4, 使用全局变量g_value 的锁,不同线程间同步
	class MyThread4 implements Runnable {
		public int value = 0;
		public  void inc() {
			{
				g_value.inc();
			}
		}

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

	public void runthread() throws InterruptedException {
		long beg = System.currentTimeMillis();
		MyThread1[] mythreadary = new MyThread1[100];
		Thread[] threadary = new Thread[100];
		for (int i = 0; i < threadary.length; i++) {
			mythreadary[i] = new MyThread1();
			threadary[i] = new Thread(mythreadary[i], "test1");
		}

		for (int i = 0; i < threadary.length; i++) {
			threadary[i].start();
		}

		for (int i = 0; i < threadary.length; i++) {
			threadary[i].join();
		   // System.out.println((mythreadary[i]).value);
		}

		System.out.println(TestVolatile.n);
		System.out.println(m);

		System.out.println("程序耗时: " + (System.currentTimeMillis() - beg));
	}

	public static void main(String[] args) throws InterruptedException {
		TestVolatile tmp = new TestVolatile();
		tmp.runthread();
	}
}

  

时间: 2024-10-27 19:55:13

Java 多线程序的一点理解的相关文章

对JAVA多线程 并发编程的理解

对JAVA多线程并发编程的理解 Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结. 线程状态转换 Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是: ?  新建(New):创建后尚未启动的线程处于这种状态 ?  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可

Java常量池的一点理解

关于网上的一个面试题,求输出结果: /** * * @author DreamSea 2011-11-19 */ public class IntegerTest { public static void main(String[] args) { objPoolTest(); } public static void objPoolTest() { Integer i1 = 40; Integer i2 = 40; Integer i3 = 0; Integer i4 = new Intege

Java中try-catch-finally的一点理解

在只有try-catch语句中,如果catch块中出现了return语句或者抛出了异常,那么catch之后的语句是执行不到的:但是如果将代码放入finally中,即使catch中出现了return语句或者抛出了异常,finally中的代码仍然是可以执行到的.看下面的程序: public class Test { public static void main(String[] args) { // TODO Auto-generated method stub System.out.printl

Java多线程同步锁的理解

ava 多线程中同步锁的主要通过synchronized的关键字来实现的.让我们从一个买票程序说起吧. package com.day04; /** * * @author Administrator 问题描述:使用多线程的方式来模拟多个窗口买票 * */ public class SaleWindow implements Runnable { // 初始化票数10 private int ticket = 10; @Override public void run() { // 获取线程的名

多线程序的角度理解静态类

通常称为嵌套类,当内部类是static时,意味着: 1  要创建嵌套类的对象,并不需要其外围类的对象 2 不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员) 在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上.普通非静态内部类的对象是依附在外部类对象之中的,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例.静态类和方法只属于类本身,并不属于该类的对象,更不属于其他外部类的对象, 所以只能访问外部类的静态方法.

关于java中String的一点理解

??String类是java的最基本类之中的一个,非常好的掌握它的原理非常是必要的! ? 1.String的Final类型的.是不可继承 的.final类默认的方法都为final类型,保证了方法不能被重载.成员变量不影响 ? 2.String的本质就是char[] 而且其值是不可改变的 ? 3.String str = "abc"是一种特殊的创建方式,"abc"存在常量区,str仅仅是对其的引用 ? 4.String能够通过+串联.形成一个新的对象 ? 5.java

java多线程那点事

屌丝程序员们对自己的技术能力总是毫不掩饰的高调,更有甚者每当完成一个简单的功能或算法实现,恨不得从工位上跳起来,生怕谁不知道一样,心情能理解,但个人完全鄙视这种行为.说到底,大家日常的coding,大多在单线程下执行,代码书写的顺序即执行的顺序,很多时候也是我们解决问题的逻辑顺序.有很多代码,如果考虑多线程,从并发的角度去实现,伪"大牛"们可能就要原形毕露了,很多同学更是束手无策.那么,多线程真的那么可怕么?接下来本人 把自己的一些理解分享出来,如有不当,欢迎指正. java多线程问题

Java多线程学习笔记--生产消费者模式

实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前水平只能膜拜,本次只能算学习笔记,为了巩固自己对Java多线程常规知识点的理解,路过大神还望能指导指导.下面一段代码是最常规的生产者消费者的例子: package com.zhanglei.demo; import java.util.ArrayList; import java.util.List

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及