- 浏览: 85104 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (89)
- 源码 (2)
- tomcat服务器连接数问题解决方法 (2)
- Android (26)
- JAVA 基本 (17)
- 设计模式 (6)
- Spring Struts Hibernate ibatis Web (9)
- 汇总小结 (1)
- 性能优化 (1)
- 小算法 (1)
- Android 异常 (1)
- Http web (1)
- Linux (4)
- C C++ (1)
- JNI ANDROID (1)
- UML (1)
- 其他 (1)
- 图像 (1)
- Spring (2)
- 分布式集群 (1)
- 数据库 (4)
- jquery (1)
- oracle和mysql 积累 (0)
- struts (1)
- 宕机 (1)
- mybaties (1)
- DH_Robot1_Chn_LeChange-Baby_V1.000.0005.3.R.160407.zip (0)
- 积累 (1)
- 架构 (1)
- 基础问题? (0)
- 111 (0)
最新评论
-
jbeduhai:
表达贴切,顶一个
ThreadLocal
Java 多线程程序设计要点:
http://www.diybl.com/course/3_program/java/javajs/20100522/203539.html
所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。
方法1:使用ThreadLocal
private final static ThreadLocal<Boolean> state = new ThreadLocal<Boolean>();
方法2:使用同步关键字synchronized
- public void setState(boolean state) {
- synchronized (this.state) {
- this.state = state;
- }
- }
方法3:使用锁
- public void setState(boolean state) {
- lock.lock();
- try {
- this.state = state;
- } finally {
- lock.unlock();
- }
- }
方法4:使用Atomic类型
private AtomicBoolean state = new AtomicBoolean();
用volatile修饰变量,不能实现类似的功能 volatile有可见性,但没有原子性 解释见下面:
转载 :http://www.iteye.com/topic/1124373
volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源
public static volatile int n = 0 ; 1000
因是声明为volatile的简单变量如果当前值由该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作:
n = n + 1 ;
n ++ ;
在使用volatile关键字时要慎重,并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的上一个决定时,如n=n+1、n++ 等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的。所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchronized来代替volatile
- public class ThreadTest{
- public void test(){
- Object lock=new Object();
- synchronized (lock){ // 每个线程进来都会执行Object lock=new Object();每个线程都有自己的lock,根本不存在锁竞争
- //do something
- }
- }
- }
ThreadLocal与synchronized多线程并发访问区别1
http://www.easy518.com/bbs/?p=23
synchronized(core){ // 锁住对象!
core.put();
}
public synchronized void put(){// 锁住对象方法!
if (count>=3) {
System.out.println("生产者被阻塞");
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
count++;
this.notify();
}
java.lang.IllegalMonitorStateException
首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出: 1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法; 2>当前线程不含有当前对象的锁资源的时候,调用obj.notify()方法。 3>当前线程不含有当前对象的锁资源的时候,调用obj.notifyAll()方法。
由线程引发的内存模型分析:
http://www.blogjava.net/qileilove/archive/2011/09/22/359262.html
http://jameswxx.iteye.com/blog/806968
http://guibin.iteye.com/blog/1172731
http://wenku.baidu.com/view/4afaaf2e453610661ed9f4dc.html
发表评论
-
JVM以及调优
2016-01-08 09:14 24631. http://blog.csdn.net/caih ... -
java 编译工程
2015-09-19 10:31 589有目录Java- ... -
类加载器
2012-08-09 12:43 8091 bootstrap ==== jre/lib/rt.ja ... -
OH 亲的缓存
2012-08-02 17:18 7391. http://wenku.baidu.com/vie ... -
java 基础测试
2012-07-25 19:57 7571, String string = nul ... -
基本算法排序
2011-05-25 10:58 717public class MaoPaoSort { ... -
Java对二进制与字符串转换
2011-05-16 14:04 950package test; import java. ... -
== String
2011-04-26 15:59 830public static void main(Str ... -
深入Java虚拟机:JVM中的Stack和Heap
2011-04-26 11:37 832在JVM中,内存分为两个 ... -
java scjp
2011-04-18 16:25 679String str1= "abc&qu ... -
c++ java 关键字
2011-04-01 09:16 1034JAVA:标有*号的是C++有相似作用的关键字 abstra ... -
ThreadLocal
2011-03-18 15:25 1343ThreadLocal ThreadLocal为解决多 ... -
singleton 模式
2011-03-18 14:01 849public class Singleton { ... -
ConcurrentHashMap
2011-03-16 14:02 739ConcurrentHashMap 分离锁和并发! -
scjp构造函数
2011-01-12 10:34 8011.子类继承父类带参数的构造函数 必须也有带参的构造函数。否则 ... -
scjp重载和重写
2011-01-12 10:27 841重载:1.必须不同参数列表且名字一定一样,其他不限制 2.可以 ...
相关推荐
一、多线程基本使用 在C#中,创建和管理线程主要依赖于`System.Threading`命名空间中的`Thread`类。通过实例化`Thread`类并传入一个`ThreadStart`委托或`ParameterizedThreadStart`委托,我们可以启动新的线程。例如...
1. **多线程基本使用** 在C#.NET中,我们可以使用`System.Threading`命名空间中的`Thread`类来创建和管理线程。创建一个新线程的基本步骤包括: - 定义一个包含线程执行逻辑的方法。 - 实例化一个新的`Thread`...
1. **多线程基本使用**: 多线程的基本使用通常涉及到创建和启动线程。在C#中,可以使用`System.Threading.Thread`类来创建新线程。通过实例化`Thread`对象并传递一个委托(如`ThreadStart`或`...
1. **多线程基本使用**:在C#中,创建和管理线程主要通过`System.Threading`命名空间下的类。例如,`Thread`类用于创建和启动新线程,`ThreadPool`则提供了一种更灵活的线程复用方式。基础实例可能包括创建一个新...
以上知识点涵盖了标题和描述中提到的“多线程基本使用”和“多线程互斥”。在实际开发中,理解和熟练运用这些技术,能够编写出高效、稳定且线程安全的C#程序。通过提供的压缩包文件,可以深入学习和实践这些实例,...
1. **多线程基本使用** 多线程是指在一个应用程序中同时运行多个执行线程。在C#中,可以使用`System.Threading`命名空间下的`Thread`类来创建和管理线程。创建新线程的基本方法是通过实例化`Thread`类,并传递一个...
1. **多线程基本使用**:在C#中,创建和管理线程主要通过`System.Threading`命名空间中的`Thread`类。通过实例化`Thread`类,并提供一个执行的方法(通常为`ThreadStart`委托),可以启动新线程。此外,`ThreadPool`...
以下是对标题和描述中涉及的Linux线程基本编程知识点的详细解释: 1. **创建线程** - 使用`pthread_create()`函数创建线程。它接受四个参数:线程ID的指针,线程属性(可选),线程启动函数的指针和传递给该函数的...
1. **多线程基本使用** 多线程的基本使用通常涉及`System.Threading`命名空间中的类,如`Thread`。通过创建`Thread`对象并调用其`Start()`方法,可以启动一个新的线程执行特定的代码块。例如: ```csharp Thread ...
一、多线程基本使用 1. **线程创建**:在C#中,可以使用`System.Threading.Thread`类来创建和启动新线程。通过实例化`Thread`类,并提供一个委托(或称回调函数)作为线程执行的入口点,然后调用`Start()`方法启动...
本教程中的"java线程入门教程,涉及线程基本知识,显浅易懂."文件将详细讲解这些概念,并通过示例代码帮助读者理解和实践。"1-2论坛"可能包含了一些讨论和问题解答,可以帮助你解决学习过程中遇到的困惑。通过学习这...
《Windows编程 多线程基本知识》 在Windows编程领域,多线程技术是不可或缺的一部分,它能够显著提升程序的运行效率和CPU资源利用率。理解并掌握多线程编程是每个Windows开发者必须具备的技能。 首先,我们来探讨...
1. **多线程基本使用** - **线程创建**:在C#中,可以使用`System.Threading.Thread`类来创建和启动新线程。通过`new Thread()`创建线程对象,并传入一个委托(方法)作为线程的入口点。 - **Start方法**:创建...
本压缩包“C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)-RFU9.rar”显然是一个关于C#多线程编程的学习资源,包含了六个具体的实例,涵盖了从基础到高级的多线程应用。 首先,我们来...
1. **多线程基本使用**: - **创建线程**:C#中可以通过`System.Threading.Thread`类创建新线程,通过`new Thread()`实例化,并通过`Start()`方法启动线程。 - **线程委托**:线程执行的任务通常通过委托...