synchronized其实就是加锁的意思
有两种加锁方式:1,给当前对象加锁
2,给当前对象对应的class实例加锁
看看第一种加锁方式
class M{
public synchronized void m1(){};
public synchronized void m2(){};
}
这是给对象加锁的第一种方式
比如产生了一个对象,M m = new M();此时两个线程A,B;当A操作这个m的m1方法时,会给这个m加锁,然后执行m1,而线程B调用这个m的m2时,也会想给这个m加锁,然而m已经被线程A加了锁,所以无法加锁,也就不能执行这个方法直到线程A把m1方法执行完,并把给m加的锁释放,这时线程B才能给m加锁,并执行m2方法。
再来看看第二种给对象加锁的方式,也就是加锁代码块:
class M{
public void m1(){
synchronized(this){
}
};
public void m2(){
synchronized(this){
}
};
}
this代表当前对象,加锁方式同上。
也可以这样实现:
class M{
Object o = new Object();
public void m1(){
synchronized(o){
}
};
public void m2(){
synchronized(o){
}
};
}
现在看看第2种:给class加锁;
class M{
public synchronized static void f1(){}
public synchronized static void f2(){}
}
执行方式如先前给对象加锁一样,只是这里是给class加锁了,
M m1 = new M(); M m2 = new M();
产生两个对象,两个线程A,B,当线程A操作m1的f1时,会给class M加锁,这时线程B想调用m2的方法时,会想给class M加锁,显然是不行的;然而如果把f2的static去掉后,这时线程B想调用m2的方法时确实可以的,因为它是想给m2对象加锁,显然这个对象还没被加锁。
public synchronized void f2(){}
分享到:
相关推荐
通过这次实验,我深刻理解了线程同步的重要性,特别是在提高系统效率的同时,避免数据冲突和资源浪费。线程同步不仅仅是防止数据的不一致,更是保证程序正确性的关键。同时,我也认识到不同的同步工具各有优势,需要...
### servlet与Struts action线程安全问题分析 #### 关键知识点概述 1. **Servlet的多线程机制**:Servlet的高效...开发者应当深刻理解多线程编程的概念,特别是在高度并发的环境中,确保代码的正确性和数据的一致性。
Java的并发包java.util.concurrent是Java多线程编程中的重要组成部分,它提供了比原生的java.lang.Thread类和synchronized关键字更高级的并发工具。比如,它提供了线程池的实现(如ExecutorService和...
《JAVA面试宝典2013》中涉及了Java编程语言的许多...通过以上知识点的梳理,我们可以看到《JAVA面试宝典2013》覆盖了Java程序员在面试中可能遇到的各类问题,尤其强调了Java编程语言的细节和面向对象编程的深刻理解。
双星习题可能包含创建和管理线程,使用synchronized关键字保证线程安全,理解wait()、notify()和notifyAll()方法的使用场景,以及深入研究ThreadLocal和ExecutorService等高级并发工具。解决这些题目需要对线程生命...
6. **多线程**:讲解如何创建和管理线程,理解同步和互斥的概念,以及使用synchronized关键字和Thread类的方法。 7. **Java Swing和JavaFX**:如果涉及到图形用户界面(GUI)编程,会介绍如何使用这些库创建窗口...
2. **同步机制**:深入讲解synchronized关键字的用法,包括对象锁、类锁、同步代码块和同步方法。此外,还会涉及volatile关键字的作用及其与synchronized的区别。 3. **并发容器**:如ArrayList、LinkedList、...
面试中可能会讨论到线程同步机制,包括synchronized关键字、volatile、Lock接口(ReentrantLock、ReadWriteLock)以及并发容器(如ConcurrentHashMap、CopyOnWriteArrayList等)。此外,活锁、死锁的概念及其避免...
例如,集合框架中的ArrayList和LinkedList是如何实现动态扩容的,HashMap的散列策略如何避免碰撞,以及线程同步的底层机制如synchronized关键字的工作原理等。 其次,理解JVM的源代码,包括类加载、字节码解析、...
在Java中,多线程编程是经常遇到的,理解线程同步、并发控制(synchronized关键字、Lock接口)和线程池的概念对优化程序性能至关重要。另外,内存管理,尤其是垃圾回收机制,也是Java开发者需要精通的部分,这关乎到...
Java提供了丰富的线程API,如Thread类、Runnable接口、synchronized关键字、volatile关键字、Lock接口等。理解并发原理,掌握线程同步和通信的方法,如wait()、notify()、notifyAll(),是高级Java开发者的基本功。 ...
通过深入学习以上知识点,并结合实际编程经验,你将能够在面试中展现出对C、C++、Java的扎实基础和对数据结构的深刻理解,提高应聘成功的可能性。记住,理论知识与实践相结合是提升技能的关键。
同时,线程和并发编程也是Java的一大特色,读者会学习到如何创建和管理线程,以及同步机制如synchronized关键字和wait/notify机制,这对于开发多线程应用至关重要。 对于高级部分,读者将接触反射机制,这允许程序...
书中通过实例解释了如何创建和管理线程,以及如何使用synchronized关键字和wait/notify机制来解决线程同步问题。 此外,《Head First Java》还介绍了Java的网络编程,包括Socket编程,这对于开发网络应用或者进行...
读者将学习到如何创建和管理线程,理解同步和互斥的概念,以及如何使用synchronized关键字和java.util.concurrent包来实现并发控制。 网络编程也是Java2的重要部分,书中会介绍Socket编程和HTTP协议,使开发者能够...
5. **多线程**:涵盖线程的基本概念、同步机制(如synchronized关键字、wait()和notify()方法)以及线程池的使用。 6. **输入/输出**:包括文件操作、数据流、序列化和文件复制等,让你掌握Java I/O系统的基本用法...
在Java编程中,考生需要掌握基础语法,例如变量、数据类型、运算符、流程控制语句等,同时对类、对象、接口、抽象类等面向对象概念有深刻理解。此外,Java集合框架,如List、Set、Map接口及其实现类,以及泛型、枚举...
在操作系统中,进程同步是一个关键的概念,用于控制多个并发进程之间的协调与合作,确保它们能够...通过这样的实践,我们可以更深刻地理解操作系统中的进程同步概念,为进一步学习和解决更复杂的并发问题打下坚实基础。
Java提供了丰富的并发工具,如synchronized关键字、volatile变量、ThreadLocal、ExecutorService、Semaphore、CyclicBarrier等。理解线程安全、死锁、活锁、饥饿等问题以及如何避免这些问题,是面试中常见的考题。...