内置类和对象锁改变 笔记记录
来源:互联网 发布:协同过滤算法 编辑:程序博客网 时间:2024/05/01 00:32
当内置类是私有的,若实例化该类与内置类 在一个包下可以实例化。若不在一个包下要实例化,需要将内置类改为public
package com.inner;
public class PublicClass {
private String username;
private String password;
public class PrivateClass{
private String age;
private String address;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.test;
import com.inner.PublicClass;
import com.inner.PublicClass.PrivateClass;
public class Run {
public static void main(String[] args) {
PublicClass publicClass=new PublicClass();
publicClass.setPassword("123456");
publicClass.setUsername("a");
PrivateClass privateClass=publicClass.new PrivateClass();
privateClass.setAge("124");
privateClass.setAddress("武汉");
}
}
当内置类为静态内置类时 不需要在使用publicClass.new PrivateClass() 实例化PrivateClass 因为静态变量 静态内置类都属于类所有,不属于对象所有。
对象锁改变:当开始执行时所有线程争夺同一个对象锁,线程同步,若两个线程由于所对象的改变,并不是争夺的同一个锁的时候线程异步。
package com.inner;
public class MyService {
private String lock="123";
public void testMethod(){
synchronized(lock){
try{
System.out.println(Thread.currentThread().getName()+" begin "+System.currentTimeMillis());
lock="456";
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+" end "+System.currentTimeMillis());
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
package com.inner;
public class ThreadA extends Thread{
private MyService myService;
public ThreadA(MyService myService){
this.myService=myService;
}
public void run(){
myService.testMethod();
}
}
package com.inner;
public class ThreadB extends Thread{
private MyService myService;
public ThreadB(MyService myService){
this.myService=myService;
}
public void run(){
myService.testMethod();
}
}
package com.inner;
public class Run {
public static void main(String[] args) {
MyService myService=new MyService();
ThreadA thread1=new ThreadA(myService);
thread1.setName("a");
ThreadB thread2=new ThreadB(myService);
thread2.setName("b");
thread1.start();
/* try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}*/
thread2.start();
}
}
如果不加延时,两个线程几乎同时运行,争夺同一个对象,假若线程a拿到了该对象锁,即使在运行过程中lock="456" lock 改变了,但是线程2是等着线程a释放掉“123”的对象锁,如果加延时,线程a先运行,当执行到lock="456"时,线程b其实是得到对象“456”的锁。对象不一样因此异步。
该实例主要是用到了常量池缓存的特性。如果是对象,即使改变了对象的某个属性后,依然是同步的,因为对象没改变。
- 内置类和对象锁改变 笔记记录
- JavaScript类和内置对象
- JavaScript学习笔记(3)DOM对象和内置对象
- 内置对象学习笔记
- jsp内置对象笔记
- JSP内置对象和EL内置对象
- 《零基础入门学习Python》学习过程笔记【40类和对象的相关内置函数】
- JSP笔记-开发环境、基本语法和内置对象
- javascript内置对象常用属性和方法(笔记一)
- javascript内置对象常用属性和方法(笔记二)
- javascript内置对象常用属性和方法(笔记三)
- DOM对象和内置对象
- 包装对象和内置对象
- 微软内置类记录
- jsp 内置对象 复习笔记
- jsp学习笔记--内置对象
- js内置对象 学习笔记
- JSP内置对象学习笔记
- 送礼物案例搞定代理模式的应用
- C语言学习历程(三)C语言基础知识预习总结
- linux基础学习
- axis=1和axis=0的问题
- [IDEA] 展示一个类的所有方法
- 内置类和对象锁改变 笔记记录
- 关于计算机和C语言的部分基本概念
- java线程安全之wait/notify模拟Queue (九)
- 入门要懂得的
- C语言基础整理1
- 大三上第一次作业--12个Linux基本问题的讨论
- C语言小知识
- 关于mysql的用户管理,笔记 1、创建新用户 通过root用户登录之后创建 >> grant all privileges on *.* to testuser@localh
- JetBrains 里不为人知的秘密--特别篇(1)