- 필수 기능
- 시작하기
- Glossary
- 표준 속성
- Guides
- Agent
- 통합
- 개방형텔레메트리
- 개발자
- Administrator's Guide
- API
- Datadog Mobile App
- CoScreen
- Cloudcraft
- 앱 내
- 서비스 관리
- 인프라스트럭처
- 애플리케이션 성능
- APM
- Continuous Profiler
- 스팬 시각화
- 데이터 스트림 모니터링
- 데이터 작업 모니터링
- 디지털 경험
- 소프트웨어 제공
- 보안
- AI Observability
- 로그 관리
- 관리
",t};e.buildCustomizationMenuUi=t;function n(e){let t='
",t}function s(e){let n=e.filter.currentValue||e.filter.defaultValue,t='${e.filter.label}
`,e.filter.options.forEach(s=>{let o=s.id===n;t+=``}),t+="${e.filter.label}
`,t+=`ID: csharp-best-practices/locking-public-instances
Language: C#
Severity: Warning
Category: Performance
The rule “Do not lock on publicly accessible instance” is a crucial guideline in multithreaded programming in C#. It is designed to prevent potential deadlocks and other synchronization issues that can occur when multiple threads try to acquire a lock on the same publicly accessible object.
Locking on a public object can lead to deadlocks if another thread outside your code also locks on that object. This is because locking on ’this’ or other publicly accessible instances exposes your lock to external manipulation and can cause unpredictable behavior.
To avoid this, always use a private, readonly object to lock on. This practice ensures that the lock is not accessible from outside the class and that its state can’t be modified, providing a controlled environment for synchronization. For example, you can create a private, readonly object specifically for locking like so: private readonly object _lockObject = new object();
. Then, use this object in your lock
statement: lock (_lockObject) {...}
. This way, you adhere to encapsulation principles and maintain control over the synchronization process.
public class SharedResource
{
public object LockObject = new object();
public void DoSomething()
{
if (something) {
lock (this)
{
}
}
}
}
public class SharedResource
{
public object LockObject = new object();
public void DoSomething()
{
lock (LockObject)
{
}
}
}
private readonly object _lockObject = new object();
public void Foo()
{
lock (_lockObject)
{
}
}
class SharedResource
{
public object LockObject = new object();
public void DoSomething()
{
if (something) {
lock (this)
{
}
}
}
}