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();
}
}
Java 多线程序的一点理解的更多相关文章
- Java多线程同步锁的理解
java主要通过synchronized的关键字来实现的.让我们从一个买票程序说起吧. package com.day04; /** * * @author Administrator 问题描述:使用 ...
- 对java多线程的一些浅浅的理解
作为一名JAVA初学者,前几天刚刚接触多线程这个东西,有了些微微的理解想写下来(不对的地方请多多包涵并指教哈). 多线程怎么写代码就不说了,一搜一大堆.说说多线程我认为最难搞的地方,就是来回释放锁以及 ...
- java 多线程详细笔记(原理理解到全部使用)
鸽了好久以后终于又更新了,看同学去实习都是先学源码然后修改之类,才发觉只是知道语法怎么用还远远不够,必须要深入理解以后不管是学习还是工作,才能举一反三,快速掌握. 目录 基础知识 进程与线程 线程原子 ...
- 关于java多线程关键字volatile的理解
volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. 使用volition关键字增加了实例变量在多个线程间的可见性.但volition有个致命的缺点就是不 ...
- Java中try-catch-finally的一点理解
在只有try-catch语句中,如果catch块中出现了return语句或者抛出了异常,那么catch之后的语句是执行不到的:但是如果将代码放入finally中,即使catch中出现了return语句 ...
- 1.1对java web开发的一点理解
前言 Q:通常行内人士见面会问你,你做哪方面开发的? A:java web开发的 那么,什么是java web开发? java web开发通常是指java web应用程序的开发.一个B/S架构的 we ...
- 关于java中String的一点理解
String类是java的最基本类之中的一个,非常好的掌握它的原理非常是必要的! 1.String的Final类型的.是不可继承 的.final类默认的方法都为final类型,保证了方法不能被 ...
- java多线程那点事
屌丝程序员们对自己的技术能力总是毫不掩饰的高调,更有甚者每当完成一个简单的功能或算法实现,恨不得从工位上跳起来,生怕谁不知道一样,心情能理解,但个人完全鄙视这种行为.说到底,大家日常的coding,大 ...
- Java多线程学习笔记--生产消费者模式
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
随机推荐
- Tips & Tricks Learned Releasing an Hybrid App Using Steroids.js
http://marcgg.com/blog/2014/04/09/phonegap-steroids-hybrid-native-app-tips/
- 20145202马超《java》实验四
实验指导:http://www.cnblogs.com/lxm20145215----/p/5444207.html 实验指导:http://www.cnblogs.com/Vivian517/p/6 ...
- 记录:C#监视某个文件的打开记录
首先,先说下为什么要搞这个: 1.首先,我的电脑里有5万左右的目录或文件,用于存放歌曲,数量众多.2.我不一定会用哪种软件听歌(不过也就是几种而已).3.我想在听歌的时候,检测哪首首歌被打开,能获取到 ...
- EnterpriseDB公司的 Postgres Solution Pack (一)
下载地址: http://www.enterprisedb.com/products-services-training/products/postgres-plus-solution-pack/do ...
- PHP数组中插入元素
1. array_unshift()数组头插入新元素 $fruits = array('apple','pear','banana','orange'); array_unshift($fruits, ...
- Vue框架核心之数据劫持
本文来自网易云社区. 前瞻 当前前端界空前繁荣,各种框架横空出世,包括各类mvvm框架横行霸道,比如Angular.Regular.Vue.React等等,它们最大的优点就是可以实现数据绑定,再也不需 ...
- Unity与服务区交互数据
Unity与服务区交互数据 Unity可能在用的时候使用到登陆等需要与服务器交互数据.今天尝试使用了WWW类和WWWForm类来实现Get请求与Post请求. 1.WWW Unity圣典解释: WWW ...
- Siki_Unity_2-10_数据结构与算法
Unity 2-10 数据结构与算法 任务1-1:数据结构简介 数据结构:数据存储的结构,数据之间的关系 数据结构分类: 集合:同属于一个集合 线性结构:数据元素存在一对一的关系 树形结构:数据元素存 ...
- JAVA Map 之元素定位,冲突碰撞
基本特性: 维持健值对的集合接口,健不可以重复,每一个健只能映射到一个值. Map替代了原来的虚拟类Directory. Map提供了三种集合视角,keys(KeySet),values(Values ...
- servlet和Jsp的复习整理
servlet 1.生命周期 a.构造方法.生成一个servlet b.init()方法.当开启服务器时,servlet第一次被装载,servlet引擎调用这个servlet的init()的方法,只调 ...